Serilog:restrictedToMinimumLevel 使用 LevelSwitches

Serilog: restrictedToMinimumLevel using LevelSwitches

我在 .Net 5 应用程序中使用 Serilog,我正在配置它从 appsettings.{env}.json.

加载配置

在这个文件中,我想为每个接收器指定一个不同的最低日志记录级别,我想用 LevelSwitch 来控制它,这样我就不需要为了改变这个而重新启动我的应用程序.为实现这一点,我知道可以为每个接收器指定 restrictedToMinimumLevel,但我找不到一个由开关控制的示例。它似乎只能是一个具有日志记录级别的字符串,因为当我试图将它绑定到一个开关时我得到了这个异常:

System.InvalidOperationException: 'Cannot create instance of type 'Serilog.Events.LogEventLevel' because it is missing a public parameterless constructor.'

我错过了什么吗?如何设置每个接收器的最低日志记录级别以便在运行时轻松更改而无需重新启动我的应用程序?

这些是我的设置:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "LevelSwitches": {
      "$baseSwitch": "Verbose",
      "$consoleSwitch": "Warning"
    },
    "MinimumLevel": {
      "ControlledBy": "$baseSwitch"
    },
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          //"restrictedToMinimumLevel": "Warning",   ---> this works
          //"restrictedToMinimumLevel": {            ---> this is what I need, but doesn't work
          //  "ControlledBy": "$consoleSwitch"
          //},
          "outputTemplate": "{Timestamp} [{Level:u3}] [{LogSource}]: {Message} {Properties}{NewLine}{Exception}"
        }
      },
      {
        "Name": "File",
        "Args": {
          "path": "Logs/log.txt"
        }
      }
    ],
    "Enrich": [
      "FromLogContext"
    ]
  }
}

我也对其他解决方案持开放态度。谢谢。

液位开关引用的名称不应有 $ 前缀。 $ 前缀仅用于引用声明的电平开关

{
    "Serilog": {
        "LevelSwitches": { "consoleSwitch": "Verbose" }, <<<< No $ prefix
        "WriteTo": [
            {
                "Name": "Console",
                "Args": {
                    "levelSwitch": "$consoleSwitch" <<<<<< $ prefix
                }
            }
        ]
    }
}

此外,液位开关的参数名称必须与接收器扩展方法中声明的名称相匹配。 In the case of the Console sink, it's called levelSwitch.