總結:利用asp.net core日誌進行生產環境下的錯誤排查(asp.net core version 2.2,用IIS做服務器)

概述

調試asp.net core程序時,在輸出窗口中,在輸出來源選擇“調試”或“xxx-ASP.NET Core Web服務器”時,可以看到類似“info:Microsoft.AspNetCore.Hosting.Internal.WebHost[2] Request finished in 285.6ms 200 text/css”這樣的內容,這就是asp.net core的日誌

如果出現了未捕獲的異常,在輸出窗口中可以看到出錯信息,如:fail: Microsoft.AspNetCore.Server.Kestrel[13]……An unhandled exception was thrown by the application. System.NullReferenceException: 未將對象引用設置到對象的實例。在……行號 xx 在……行號 xx

如果在生產環境中可以把這些出錯信息保存下來,將對排查代碼錯誤很有幫助。

代碼發佈後,可以看到一個web.config文件,其中有一個aspNetCore標籤,把stdoutLogEnabled屬性設置為true。這樣,在網站運行後,默認會在/logs文件夾下產生一個stdout_xxx_xxx.log的文件,日誌會保存到這裏面。

 

控制日誌數量

修改appsettings.json中的Logging/LogLevel/Default值。日誌級別從低到高為Trace 、Debug 、Information 、Warning 、Error 、Critical 、None。級別越低,輸出的日誌越多。如果僅想輸出錯誤信息,可把級別設置成Error。如果把級別設置成None,將會阻止所有級別的日誌輸出。

值得注意的時,在網站運行狀態下,修改appsettings.json中的上述配置,不會造成網站重啟(而修改web.config會造成網站重啟),但對日誌級別的控制會立即生效。

 

添加web.config到源代碼項目中

新建的asp.net core 2.2項目,默認沒有web.config文件。可以通過“添加”、“新建項”、“Web配置文件”的方式手動添加。這樣就可以在源碼項目中設定web.config的內容了。

 

使日誌包含時間

1、安裝nuget包LoggingAdvanced.Console

2、修改Program.cs的CreateWebHostBuilder方法,在其中的方法調用鏈的最後,調用ConfigureLogging方法,修改後的代碼如下:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>              WebHost.CreateDefaultBuilder(args)                  .UseStartup<Startup>()                  .ConfigureLogging((hostingContext, loggingBuilder) =>                   {                       loggingBuilder.ClearProviders();//清除所有提供程序                         loggingBuilder.AddDebug();//添加Debug提供程序                         loggingBuilder.AddEventSourceLogger();//添加EventSource提供程序                         var loggingSection = hostingContext.Configuration.GetSection("Logging");                         loggingBuilder.AddConsoleAdvanced(loggingSection);//添加LoggingAdvanced.Console提供程序                   });

3、修改appsettings.json的中的Logging部分,修改後如下:

"Logging": {      "IncludeTimestamp": true,      "IncludeLogNamespace": true,      "TimestampPolicy": {        "TimeZone": "Ulaanbaatar Standard Time",        "Format": "yyyy/MM/dd HH:mm:ss.fff"      },      "LogLevel": {        "Default": "Warning"      }    }

 

參考資料

1、有關“日誌提供程序”、“日誌級別”、“日誌篩選”等概念,請參考官方文檔:Logging in .NET Core and ASP.NET Core

2、LoggingAdvanced.Console