**
ABP VNext 的日志機制
**
正用ABP VNext做個系統,由于架構預設帶來日志處理機制,開發階段基本能用,也一直沒有去動它,快要上線了,思考了一下正式環境的日志管理流程,由于系統不大,預計通路量可能也不大,但預設的日志管理太簡單,不便于後期日常維護。
缺點如下:
- 預設的日志隻有單個檔案,寫上幾天就變得很大,起不到檢索的功能
- 預設代碼沒有把日志放在配置檔案中,如果要修改日志的配置得改代碼。
**
ABP VNext 的日志
**
為了解決以上兩個缺點,就開始研究一下ABP VNext的日志。先翻一下ABP VNext的文檔,日志有專門的菜單哦。

再看看代碼:
感覺不太對,雖然沒有用過SeriLog,但這幾個字還是認識的好吧。
那我們OK,百度一下SeriLog 連結如下:
https://github.com/serilog/serilog/wiki/Getting-Started
這下看上去和現有代碼差的不遠了,就是他了
**
SeriLog
**
知道了是用的SeriLog,就直接看SeriLog來解決這兩個問題
預設的代碼是這樣的:
在program.cs的Main方法中
Log.Logger = new LoggerConfiguration()
#if DEBUG
.MinimumLevel.Debug()
#else
.MinimumLevel.Information()
#endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt"))
.CreateLogger();
**
滾動政策
**
預設代碼就往一個logs.txt的檔案裡持續寫日志,檔案會越來越大,大到打開檔案都困難。
當然,文檔上說檔案最大預設是1G
我的日志還沒有那麼大,是以不知道是不是有效,但1G的txt等于就是個垃圾了。
看下文檔,https://github.com/serilog/serilog-sinks-file
可以給檔案加滾動政策,比如:按時間間隔生成多個檔案,或按照大小限制來分割檔案。
**
配置檔案
**
APB VNext的預設代碼沒有引用配置檔案,其實這也不是什麼大問題,因為這些配置可能永遠都不會改,但萬一哪天需要在生産環境重制或跟蹤某個問題,為了降低或升高日志記錄級别這麼個小事,就得修改代碼,還要釋出站點,這可能會帶來很多不必要和意想不到的麻煩,是以還不如多花一小點時間把這地方做好。
還是在上的文檔中,有給出引用配置檔案的方式,可以把配置資訊放在appsetting.json中。
https://github.com/serilog/serilog-sinks-file
var configuration = new ConfigurationBuilder()
#if DEBUG
.AddJsonFile("appsettings.Development.json")
#else
.AddJsonFile("appsettings.json")
#endif
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
這裡我加了條件編譯,為了在debug和釋出後引用不同的配置檔案。
配置檔案的内容可以按照文檔來寫。
{
"Serilog": {
"WriteTo": [
{ "Name": "File", "Args": { "path": "log.txt", "rollingInterval": "Day" } }
]
}
}
上面的文檔中有簡單的例子,要用到更複雜的屬性,可以看這個文檔:
https://github.com/serilog/serilog-settings-configuration
**
異步寫檔案
**
預設的代碼中用的是異步寫入日志的方法,這也可以在配置檔案中配置。
"Serilog": {
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "Async",
"Args": {
"configure": [
{
"Name": "File",
"Args": {
"path": "Logs/logs.txt",
"rollingInterval": "Day",
"retainedFileCountLimit": null
}
}
]
}
}
]
}
詳細的見文檔:https://github.com/serilog/serilog-sinks-async
**
其他
**
除了把日志寫入檔案,SeriLog還支援其他的媒介,有需要也可以試試。
見此文檔:https://github.com/serilog/serilog/wiki/Provided-Sinks