通过 API 端点的 Serilog 级别切换器

Mar*_*ern 7 c# serilog .net-6.0

我正在使用 Serilog 登录我的 .net 6 Web API,并希望公开一个端点以使我能够更改全局日志记录级别。这将使我能够通过前端切换开关切换级别。这是我到目前为止所实施的,但似乎根本没有任何效果。即使只是在启动时设置日志记录级别也不会改变“信息”的默认级别。我正在使用 .net DI 来配置一切。

这是我到目前为止所拥有的:

程序.cs

var levelSwitcher = new LoggingLevelSwitch(LogEventLevel.Verbose);

builder.Services.AddSingleton<LoggingLevelSwitch>(levelSwitcher);

var seriLogger = new LoggerConfiguration()
            .MinimumLevel.ControlledBy(levelSwitcher)
            .ReadFrom.Configuration(builder.Configuration)
            .Enrich.FromLogContext()
            .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

然后在我的端点控制器中

    private readonly LoggingLevelSwitch _levelSwitch;
    private readonly ILogger<DiagnosticsController> _logger;

    public DiagnosticsController(ILogger<DiagnosticsController> logger, LoggingLevelSwitch levelSwitch)
    {
        _logger = logger;
        _levelSwitch = levelSwitch;
    }

    [HttpGet(Name = "SwitchLoggingLevel")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    public IActionResult SwitchLoggingLevel(string level)
    {
        if (Enum.TryParse(level, out Serilog.Events.LogEventLevel newLoggingLevel))
        {
            _levelSwitch.MinimumLevel = newLoggingLevel;
            return Ok();
        }

        return BadRequest();
    }
Run Code Online (Sandbox Code Playgroud)

从我在调试器中看到的是,记录器仍然处于“信息”最低级别,即使调用端点并传入或多或少的详细级别,也没有任何效果。

我最初的想法是,我在 DI 环境中初始化切换器的方式不正确,但我不确定如何正确执行(即创建一个服务,然后立即在记录器的后续配置中使用它),但是即使这是不正确的,实际的最低级别甚至没有按照配置设置为“错误”。

Rom*_*syk 1

检查您是否已正确配置 Serilog,因为代码按预期工作。

将变量分配seriLoggerLog.Logger

Log.Logger = new LoggerConfiguration()
   .MinimumLevel.ControlledBy(levelSwitcher)
   .ReadFrom.Configuration(builder.Configuration)
   .Enrich.FromLogContext()
   .WriteTo.Console()
   .CreateLogger();

builder.Host.UseSerilog();
Run Code Online (Sandbox Code Playgroud)

请注意,您需要添加WriteTo.Console()或任何其他水槽。