總結:利用asp.net core日誌進行生產環境下的錯誤排查(asp.net core version 2.2,用IIS做伺服器)
- 2020 年 3 月 8 日
- 筆記
概述
調試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