天天看點

ABP VNext 的日志機制 + SeriLog

**

ABP VNext 的日志機制

**

正用ABP VNext做個系統,由于架構預設帶來日志處理機制,開發階段基本能用,也一直沒有去動它,快要上線了,思考了一下正式環境的日志管理流程,由于系統不大,預計通路量可能也不大,但預設的日志管理太簡單,不便于後期日常維護。

缺點如下:

  1. 預設的日志隻有單個檔案,寫上幾天就變得很大,起不到檢索的功能
  2. 預設代碼沒有把日志放在配置檔案中,如果要修改日志的配置得改代碼。

**

ABP VNext 的日志

**

為了解決以上兩個缺點,就開始研究一下ABP VNext的日志。先翻一下ABP VNext的文檔,日志有專門的菜單哦。

ABP VNext 的日志機制 + SeriLog

再看看代碼:

ABP VNext 的日志機制 + SeriLog

感覺不太對,雖然沒有用過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

可以給檔案加滾動政策,比如:按時間間隔生成多個檔案,或按照大小限制來分割檔案。

ABP VNext 的日志機制 + SeriLog

**

配置檔案

**

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