• Post author:
  • Post category:后端
  • Post comments:0评论
  • Reading time:2 mins read

因为一个统计业务的需求,需要将业务数据和系统日志分为两个文件进行记录,记录之后由日志收集系统收集到不同的ES的索引内,这里记录一下多Logger的配置方式。

首先必不可少的是,先安装Serilog.Expressions这个nuget包,网上查了很多资料鲜有提到需要安装这个包,导致踩了一个很深的坑,原因是更多的程序员喜欢使用代码内配置Serilog,而不是使用appsettings.json进行配置,后者在写Filter的表达式时,需要这个nuget包进行语法支持,不然无法正确解析为表达式。

接下来直接上配置文件:

  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "System": "Information",
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information",
        "Microsoft.EntityFrameworkCore": "Information"
      }
    },
    "WriteTo": [
      {
        "Name": "Logger",
        "Args": {
          "ConfigureLogger": {
            "WriteTo": [
              {
                "Name": "File",
                "Args": {
                  "path": "/var/applogs/adstatistics/.log",
                  "restrictedToMinimumLevel": 2,
                  "rollingInterval": 3,
                  "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} {Log4NetLevel} {Message}{NewLine}{Exception}{NewLine}"
                }
              }
            ],
            "Filter": [
              {
                "Name": "ByIncludingOnly",
                "Args": {
                  "expression": "@p['event_type'] = 'applogs'"
                }
              }
            ]
          }
        }
      },
      {
        "Name": "Logger",
        "Args": {
          "ConfigureLogger": {
            "WriteTo": [
              {
                "Name": "File",
                "Args": {
                  "path": "/var/business/adstatistics/.log",
                  "restrictedToMinimumLevel": 2,
                  "rollingInterval": 3,
                  "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} {Log4NetLevel} {Message}{NewLine}{Exception}{NewLine}"
                }
              }
            ],
            "Filter": [
              {
                "Name": "ByIncludingOnly",
                "Args": {
                  "expression": "@p['event_type'] = 'business'"
                }
              }
            ]
          }
        }
      }
    ],
    "Enrich": [
      "FromLogContext",
      "WithMachineName",
      "WithEnvironmentUserName",
      "WithProcessId",
      "WithHttpRequestId",
      "WithCorrelationId",
      "WithExceptionDetails",
      "WithDemystifiedStackTraces",
      "WithThreadId",
      "WithClientIp",
      "WithClientAgent"
    ]
  }

重点就是Filter这里的判断,@p就是serilog-expressions提供的语法解析支持,这里指的就是Serilog的Property,这个Filter的意思就是,该Logger配置作用于有”event_type”作为Property的Logger,接下来我们就可以通过Log.ForContext()这个方法使用这个Logger了:

        public HomeController(IHttpClientFactory clientFactory, IEasyCachingProviderFactory factory)
        {
            _clientFactory = clientFactory;
            _factory = factory;
            _logger = Log.ForContext("event_type", "applogs");
            _businessLogger = Log.ForContext("event_type", "business");
        }

葫芦

葫芦,诞生于1992年8月11日,游戏宅,胶佬,爱好摸鱼,一个干过超市收银,工地里搬过砖,当过广告印刷狗,做过电焊铁艺的现役.Net程序员。

发表回复