浅析ABP VNext 的日志机制 + SeriLog

浅析ABP VNext 的日志机制

  • ABP VNext 的日志
  • SeriLog
    • 滚动策略
    • 配置文件
    • 异步写文件
    • 其他

正用ABP VNext做个系统,由于框架默认带来日志处理机制,开发阶段基本能用,也一直没有去动它,快要上线了,思考了一下正式环境的日志管理流程,由于系统不大,预计访问量可能也不大,但默认的日志管理太简单,不便于后期日常维护。
缺点如下:

  1. 默认的日志只有单个文件,写上几天就变得很大,起不到检索的功能
  2. 默认代码没有把日志放在配置文件中,如果要修改日志的配置得改代码。

ABP VNext 的日志

为了解决以上两个缺点,就开始研究一下ABP VNext的日志。
先翻一下ABP VNext的文档,日志有专门的菜单哦。
浅析ABP VNext 的日志机制 + SeriLog_第1张图片
满心欢喜的点菜单
https://docs.abp.io/zh-Hans/abp/latest/Logging
结果。。。。。。
浅析ABP VNext 的日志机制 + SeriLog_第2张图片
Are you sure???
点这个链接进去看着都不太像啊,再看看代码。
What’s this???
浅析ABP VNext 的日志机制 + SeriLog_第3张图片
我虽然没有用过SeriLog,但这几个字还是认识的好吧。
OK,百度一下SeriLog。
https://github.com/serilog/serilog/wiki/Getting-Started
这下看上去和现有代码差的不远了,就是他了,没有明白为啥ABP团队把文档写成这样。

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

To avoid bringing down apps with runaway disk usage the file sink
limits file size to 1GB by default

我的日志还没有那么大,所以不知道是不是有效,但1G的txt等于就是个垃圾了。
看下文档,https://github.com/serilog/serilog-sinks-file

可以给文件加滚动策略,比如:按时间间隔生成多个文件,或按照大小限制来分割文件。
浅析ABP VNext 的日志机制 + SeriLog_第4张图片

配置文件

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

你可能感兴趣的:(ABP,VNext,c#,ABP)