在所有的應用程序中,日誌功能是不可或缺的模塊,我們可以根據日誌信息進行調試、查看產生的錯誤信息,在ASP.NET Core中我們可以使用log4net或者NLog日誌組件來實現記錄日誌的功能,這裏講解如何在ASP.NET Core中使用NLog。

1、創建項目(這裏使用Core2.2)使用NLog

NLog中 maxArchiveDays的歸檔目錄怎麼設置_配置文件

 

 

 

2、引用NLog動態庫

直接在NuGet裏面搜索NLog.Web.AspNetCore,然後進行安裝即可,如下圖所示:

NLog中 maxArchiveDays的歸檔目錄怎麼設置_xml_02

 

 

當前選的是4.13.0版本,安裝完成如下圖:

 

NLog中 maxArchiveDays的歸檔目錄怎麼設置_Code_03

 

3、修改Program類,在裏面配置使用NLog,代碼如下所示:

NLog中 maxArchiveDays的歸檔目錄怎麼設置_配置文件_04

NLog中 maxArchiveDays的歸檔目錄怎麼設置_xml_05

public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                // 配置使用NLog
                .UseNLog();

View Code

4、添加Nlog配置文件,命名nlog.config如下圖所示:

NLog中 maxArchiveDays的歸檔目錄怎麼設置_xml_06

 

 

 

5、nlog.config具體配置代碼如下:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Warn"
      internalLogFile="internal-nlog.txt">

  <!--define various log targets-->
  <targets>

    <!--write logs to file-->
    <target xsi:type="File" name="allfile" fileName="NLog_Error/nlog-all-${shortdate}.log"
                 layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />

    <target xsi:type="File" name="ownFile-web" fileName="NLog_Error/nlog-my-${shortdate}.log"
                 layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />

    <target xsi:type="Null" name="blackhole" />

  </targets>

  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Skip Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>


</nlog>

 

6、添加完配置文件以後,我們還需要修改配置文件的屬性,設置為始終複製,如下圖所示:

NLog中 maxArchiveDays的歸檔目錄怎麼設置_Code_07

 

 

 

7、控制器中使用

通過構造函數注入的方式實現注入。控制器代碼如下:

NLog中 maxArchiveDays的歸檔目錄怎麼設置_配置文件_08

NLog中 maxArchiveDays的歸檔目錄怎麼設置_配置文件_09

//通過構造函數注入的方式實現注入
        private readonly ILogger<HomeController> _logger;
        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

View Code

Action使用Nlog寫入日誌

NLog中 maxArchiveDays的歸檔目錄怎麼設置_配置文件_10

NLog中 maxArchiveDays的歸檔目錄怎麼設置_Code_11

public IActionResult Index()
        {
            _logger.LogError("這是Index錯誤信息");
            _logger.LogDebug("這是Index調試信息");
            _logger.LogInformation("這是Index提示信息");

            return View();
        }

View Code

 

8、訪問Action測試Nlog,查看是否生成日誌

nlog.config 如果未指定具體位置,將會在項目文件下bin\Debug\netcoreapp2.2的 NLog_Error文件下,如下圖:

 

 

 

NLog中 maxArchiveDays的歸檔目錄怎麼設置_xml_12

 

 

 

可以看到,啓動過程中的Microsoft日誌也輸出了,如果不想輸出Microsoft日誌,修改nlog.config裏rules節點下面的路徑規則順序即可。

NLog中 maxArchiveDays的歸檔目錄怎麼設置_Code_13

 

 

 

NLog中 maxArchiveDays的歸檔目錄怎麼設置_配置文件_14

 

 

 

9、讀取指定位置的nlog.config文件

一般情況類似的nlog.config配置文件,我們習慣性的放到單獨的配置文件夾,比如我們新建個XMLConfig文件夾,然後把nlog.config文件移到到XmlConfig文件夾下面,移到後的結構如下圖所示,我們要如何讀取?其實只需要稍微調整下Program文件,在程序裏面設置讀取XmlConfig文件夾下面的nlog.config文件,代碼如下:

NLog中 maxArchiveDays的歸檔目錄怎麼設置_xml_15

NLog中 maxArchiveDays的歸檔目錄怎麼設置_Code_16

public static void Main(string[] args)
        {
            // 設置讀取指定位置的nlog.config文件
            NLogBuilder.ConfigureNLog("XmlConfig/nlog.config");
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                // 配置使用NLog
                .UseNLog();

View Code

 

以上Core中使用Nlog基本完成,最後輸出的日誌格式是根據nlog.config配置文件裏面的layout樣式輸出的,有時候輸出的內容可能不滿足我們的需求,因為這種日誌看着比較難受,而且日誌文件基本所有的Controller和Action都會需要用的,所以咋們是不是可以考慮做下封裝,使用Filter過濾器注入到Startup類,全局使用,是不是更方便?