C# 无法将Serilog配置代码行转换为json配置

C# 无法将Serilog配置代码行转换为json配置,c#,logging,asp.net-core,serilog,C#,Logging,Asp.net Core,Serilog,我发现了一篇博文,其中博主解释了如何按LogEvent级别过滤到一个单独的文件以进行Serilog配置。我正在appsettings.json中执行所有Serilog配置。在json配置中会是什么样子,我似乎不知道如何将lambda表达式json Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Logger(l => l.Filte

我发现了一篇博文,其中博主解释了如何按LogEvent级别过滤到一个单独的文件以进行Serilog配置。我正在appsettings.json中执行所有Serilog配置。在json配置中会是什么样子,我似乎不知道如何将lambda表达式json

Logger = new LoggerConfiguration()
                .MinimumLevel.Information()
                .WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Warning).WriteTo.RollingFile(@"Logs\Warning-{Date}.log"))
我正在使用appsettings.json中的Serilog配置,并尝试转换此配置

.WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Warning).WriteTo.RollingFile(@"Logs\ApplicationName\Serilog\Warning-{Date}.log"))
到json,包括在我的appsettings文件的my Serilog部分中

编辑: 此处显示了appsettings部分

 "WriteTo": [
  {
    "Name": "Console",
    "Args": {
      "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] ({SourceContext}) {Message}{NewLine}{Exception}"
    }
  },
  {
    "Name": "Seq",
    "Args": { "serverUrl": "http://localhost:5341" }
  },
  {
    "Name": "Async",
    "Args": {
      "configure": [
        {
          "Name": "RollingFile",
          "Args": { "pathFormat": "C:/Logs/Serilog/%APPLICATION_NAME%/log-{Date}.log" }
        }
      ]
    }
  }
],
"SubLogger": {
  "Level": "Warnings",
  "pathFormat": "C:/Logs/Serilog/%APPLICATION_NAME%/Warnings/log-{Date}.log"
},
子记录器pathFormat生成的文件夹命名与RollingFile pathFormat不同


目前Serilog不支持通过JSON appsettings配置子记录器。在github上看到这个

实际上这不是一项容易的任务,因为您通过includingOnly()将
Func
传递给
。将配置数据从json文件映射到c#代码并不是一项简单的任务

但是,如果您只是对为特定日志级别创建子记录器感兴趣,那么可以将JSON配置中的配置与
通过includingOnly()
过滤器组合起来

定义将保存筛选器配置的POCO:

public class SubLoggerConfiguration
{
    public LogEventLevel Level { get; set; }

    private string pathFormat;
    public string PathFormat
    {
        get => pathFormat;
        set => pathFormat = value.Replace("%APPLICATION_NAME%", Environment.GetEnvironmentVariable("APPLICATION_NAME"));
    }
}
SubLogger
部分添加到JSON配置中:

{
  "Serilog": {
    "Using": [
      "Serilog.Sinks.RollingFile"
    ],
    "MinimumLevel": {
      "Default": "Information"
    },
    "WriteTo": [
      {
        "Name": "RollingFile",
        "Args": { "pathFormat": "c:\\Logs\\log-{Date}.log" }
      }
    ],

    "SubLogger": {
      "Level": "Warning",
      "pathFormat": "Logs\\ApplicationName\\Serilog\\Warning-{Date}.log"
    } 
  }
}
最好将它保存在原生Serilog部分中,它不会破坏Serilog本身的配置

然后从配置文件加载
SubLogger
配置:

IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("AppSettings.json");
IConfiguration configuration = configurationBuilder.Build();
SubLoggerConfiguration subLoggerConfiguration = new SubLoggerConfiguration();
configuration.GetSection("Serilog:SubLogger").Bind(subLoggerConfiguration);
请注意,您必须安装
Microsoft.Extensions.Configuration.Binder
NuGet包才能将配置绑定到POCO

现在,subLoggerConfiguration将包含所需的日志级别和日志路径格式。您可以使用此设置通过IncludingOnly()调用
过滤器:

Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == subLoggerConfiguration.Level).WriteTo.RollingFile(subLoggerConfiguration.PathFormat));

@CodeFuller…一个问题…在我的主serilog配置{“Name”:“RollingFile”,“Args”:{“pathFormat”:“C:/Logs/serilog/%APPLICATION\u Name%/log-{Date}.log”}中,使用我的环境变量中的名称创建正确的文件文件夹,但在您的子日志部分,相同的路径格式构造。。。“SubLogger”:{“Level”:“Warnings”,“pathFormat”:“C:/Logs/Serilog/%APPLICATION_NAME%/Warnings/log-{Date}.log”}生成文件路径…Logs/Serilog/%APPLICATION\u NAME%/warnings子日志部分中的任何原因它没有拾取%APPLICATION\u NAME%变量?Serilog有一个用相应的环境变量替换%APPLICATION\u NAME%模式的逻辑。实际上,任何其他变量也可以工作。您也可以这样做,请参阅更新的
SubLoggerConfiguration
在我的回答中(这只是应用程序名称的示例)。“Serilog有一个用相应的环境变量替换%APPLICATION\u NAME%模式的逻辑。”…我知道,这就是为什么我在RollingFile配置中使用它(它正在工作的地方),但同一路径未将变量名应用于子日志部分中的路径…是否有必须在类中定义它的原因?@CodeFuller…有关详细信息,请参阅我的后期编辑。再次感谢您对Serilog的所有回答?”