.NET CORE LOG
合格的應用程序不僅要求運行的高效和計算的准確,穩定及可靠性也要得到滿足,同事,系統的可維護性也相當重要。談及到可維護性,就必須涉及到系統運行狀態的監控和異常的快速定位與跟蹤。系統日志的實現主要就是為了這兩個方面。良好的日志記錄可以提供我們足夠多的數據以及信息來支持系統的穩定性運行。
Serlog
.NET Core 提供了內置的日志模塊,用來支撐日志系統的建立。當然也可以使用自己喜愛日志框架來進行記錄日志,常見的第三方日志庫有Serilog,elmah.io,NLog等,這里使用Serlog來記錄日志。Serilog 是一種非常簡便記錄log 的處理方式,能夠方便的生成本地文件,同事Serlog支持異步的輸出日志,引入以下對應的三個類庫
Serilog.Extensions.Logging
Serilog.Sinks.RollingFile
Serilog.Sinks.Async
格式定義
日志信息的記錄要適當精簡,既能夠快速及簡單的定位系統問題,而又不產生過多的無用信息,過多的無用信息不但對系統分析起不到什么作用,反而會增加系統的運行壓力、消耗系統的運行資源。因此,支持日志信息的格式的定義就顯得十分的重要。Serlog通過使用outputTemplate參數來定制化日志格式,例如
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(outputTemplate:
"{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}")
.CreateLogger();
主要的內置參數如下:
- Exception - The full exception message and stack trace
- Level - The log event level, formatted as the full level name
- Message - The log event's message, rendered as plain text.
- NewLine - A property with the value of System.Environment.NewLine.
- TimeStamp - The event's timestamp, as a DateTimeOffset.
等級輸出
日志等級通常分為:DEBUG、INFO、WARN、ERROR
- DEBUG:系統調試信息,通常用於開發過程中對系統運行情況的監控,在實際運行環境中不進行輸出。
- INFO: 系統運行的關鍵性信息,通常用於對系統運行情況的監控。
- WARN:告警信息,系統存在潛在的問題,有可能引起運行異常,但此時並未產生異常。
- ERROR:系統錯誤信息,需要進行及時處理和優化。
不同的等級對應不同的系統運行狀態,通常而言,不同的狀態信息輸出到對應的文件中,對系統進行分析,能達到事半功倍的效果。Serilog中使用Filter.ByIncludingOnly方法來實現輸出日志到不同的文件中,例如:
var baselogger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Logger(fileLogger => fileLogger
.Filter.ByIncludingOnly(p => p.Level.Equals(LogEventLevel.Debug))
.WriteTo.RollingFile(@"logs/log-{Date}-Debug.txt"));
示例
首先在創建的MVC站點的Stratup方法中配置對應Serilog
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Debug()
.MinimumLevel.Override("System", LogEventLevel.Information)
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Debug).WriteTo.Async(
a => a.RollingFile("logs/log-{Date}-Debug.txt")
))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Information).WriteTo.Async(
a => a.RollingFile("logs/log-{Date}-Information.txt")
))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Warning).WriteTo.Async(
a => a.RollingFile("logs/log-{Date}-Warning.txt")
))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Error).WriteTo.Async(
a => a.RollingFile("logs/log-{Date}-Error.txt")
))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Fatal).WriteTo.Async(
a => a.RollingFile("logs/log-{Date}-Fatal.txt")
))
.CreateLogger();
其次,在Configure方法中注冊Serilog
loggerFactory.AddSerilog();
接着在HomeController的Index方法中手工調用記錄錯誤日志
public ActionResult Index()
{
Log.Logger.Error("This is index -- error.");
return View();
}
運行代碼,在本地logs文件夾下出現log-20170710-Error.txt文件,內容如下:
2017-07-13 20:47:44.143 +08:00 [Error] .......