1. 程式人生 > >ASP.NET Core 2.1 : 十二.內置日誌、使用Nlog將日誌輸出到文件(轉)

ASP.NET Core 2.1 : 十二.內置日誌、使用Nlog將日誌輸出到文件(轉)

layout short including 文件名 rdquo 1.0 復雜 net 當前

應用離不開日誌,雖然現在使用VS有強大的調試功能,開發過程中不復雜的情況懶得輸出日誌了(想起print和echo的有木有),但在一些復雜的過程中以及應用日常運行中的日誌還是非常有用。

  ASP.NET Core提供了內置的日誌,但沒弄明白這麽把它輸出到文件, 只能在VS的輸出中查看, 誰知道怎麽弄告訴我一下。(ASP.NET Core 系列目錄) 本例 GitHub

一、內置日誌的使用

  上一篇:如何在後臺運行一個任務 中使用到了內置的日誌,直接在構造中註入一下,然後直接使用即可, 非常方便

技術分享圖片
        public TokenRefreshService(ILogger<TokenRefreshService> logger)
        {
            _logger = logger;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            _logger.LogInformation("Service starting");
           //************
        }
技術分享圖片

然後在【輸出】窗口中就可以看到輸出的日誌了:

技術分享圖片

想把它輸出到txt中, 沒找到相應的方法,試試常見的Nlog吧

二、使用Nlog將日誌輸出到文件

A.安裝Nlog

在NuGet中搜索並安裝 NLog.Web.AspNetCore , 當前版本是4.5.4

技術分享圖片

B.添加配置文件

新建一個文件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"
      throwConfigExceptions="true"
      internalLogLevel="info"
      internalLogFile="d:\log\internal-nlog.txt">


  <!-- the targets to write to -->
  <targets>
    <!-- write logs to file  -->
    <target xsi:type="File" name="allfile" fileName="d:\log\nlog-all-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />

    <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
    <target xsi:type="File" name="ownFile-web" fileName="d:\log\nlog-own-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" />
  </targets>

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

    <!--Skip non-critical Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" maxlevel="Info" final="true" />
    <!-- BlackHole -->
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>
</nlog>
技術分享圖片

C.修改Program.cs文件

.UseStartup<Startup>() 後添加一句 .UseNLog()

三、註意事項

按照第二節的描述,NLog已經可以正常使用了,有些細節做一下簡要說明:

1. 文件nlog.config的這個名字應該是默認讀取的文件名(官方建議全部小寫,linux系統中要註意),如果用了別的名字,可以在Program.cs文件中通過 ConfigureNLog 方法設置,見下面代碼示例。

2. 現在如第一節內置的例子中一樣, VS的輸出框仍然在輸入日誌,也就是二者都在生效狀態,想只用Nlog,可以調用 logging.ClearProviders();

3. 註意輸出目錄的權限問題。

代碼示例:

技術分享圖片
 1     public class Program
 2     {
 3         public static void Main(string[] args)
 4         {
 5             NLog.Web.NLogBuilder.ConfigureNLog("nlog1.config");  //假如沒有用默認的名字,多寫了一個1
 6             CreateWebHostBuilder(args).Build().Run();
 7         }
 8 
 9         public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
10             WebHost.CreateDefaultBuilder(args)
11                 .UseStartup<Startup>()
12                 .ConfigureLogging(logging =>
13                 {
14                     logging.ClearProviders(); //移除已經註冊的其他日誌處理程序
15                     logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); //設置最小的日誌級別
16                 })
17                 .UseNLog();  
18     }
技術分享圖片

四、NLog配置簡要說明

“簡要”的說一下NLog的配置:

1.上文提到了一個日誌級別,這個級別大概分為6個,由低到高如下:

技術分享圖片
1 logger.LogTrace();
2 logger.LogDebug();
3 logger.LogInformation();
4 logger.LogWarning();
5 logger.LogError();
6 logger.LogCritical();
技術分享圖片

2. 通過上面的例子,看輸出的日誌文件有3個, 這是在nlog.config中配置的, 通過文件名可以找到對應的配置。

  • internal-nlog 記錄了NLog的啟動及加載config的信息。
  • nlog-all 記錄了所有日誌
  • nlog-own 記錄了我們自定義的日誌

這是為什麽呢?config中有兩個關鍵標簽<targets>和 <rules>

  • <targets> 用於配置輸出相關內容,比如 type 屬性可選項為File、Mail、Console等,用於設置輸出目標,layout屬性用於設置輸出信息的組成元素及格式。
  • <rules> : 這裏有個坑,一看這個標簽,簡單理解成了“規則”,而恰好例子中的兩個<rule>正好對應了上面的兩個<target>,writeTo屬性指定了對應的<target>。可仔細一看,兩個的<rule>配置差不多,為什麽下面的一個就只輸出了我們自定義的log呢?看幫助才知道這是一個“路由表”,日誌是從上到下匹配的。 <logger name="Microsoft.*" maxlevel="Info" final="true" /> 一句話的 final="true" 過濾掉了"Microsoft.*"的日誌。

原文地址:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_12.html

ASP.NET Core 2.1 : 十二.內置日誌、使用Nlog將日誌輸出到文件(轉)