在Serilog中更改/覆盖日志事件级别

Tam*_*eme 6 .net c# serilog

有没有一种方法可以动态更改某些事件的日志级别?(也许按名称空间或谓词)

我正在寻找类似的东西,.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)但我真正想做的就是将Information事件的级别从Microsoft命名空间更改为Verbose。重要性较高的事件应保持原样。

编辑:

扩展程序无法更改日志事件级别。 在此处输入图片说明

Nic*_*rdt 11

有可能,但并非完全简单,因此请紧紧抓住自己!

1.创建一个水槽包装

您需要在目标接收器周围创建一个包装器,而不是浓缩器。包装器将从日志记录管道接收事件,(相当便宜)创建具有相同属性的新事件,并将其转发到实际接收器:

class LevelBoostingWrapper : ILogEventSink, IDisposable
{
    readonly ILogEventSink _wrappedSink;

    public LevelBoostingWrapper(ILogEventSink wrappedSink)
    {
        _wrappedSink = wrappedSink;
    }

    public void Emit(LogEvent logEvent)
    {
        if (logEvent.Level == LogEventLevel.Warning)
        {
            var boosted = new LogEvent(
                logEvent.Timestamp,
                LogEventLevel.Warning, // <- the boost
                logEvent.Exception,
                logEvent.MessageTemplate,
                logEvent.Properties
                    .Select(kvp => new LogEventProperty(kvp.Key, kvp.Value)));

            _wrappedSink.Emit(boosted);
        }
        else
        {
            _wrappedSink.Emit(logEvent);
        }
    }

    public void Dispose()
    {
        (_wrappedSink as IDisposable)?.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,决定要修改哪些事件的实际标准取决于您。

2.将包装器挂接到配置语法中

这个小扩展使设置包装器变得更加愉快:

static class LoggerSinkConfigurationExtensions
{
    public static LoggerConfiguration Boosted(
        this LoggerSinkConfiguration lsc,
        Action<LoggerSinkConfiguration> writeTo)
    {
        return LoggerSinkConfiguration.Wrap(
            lsc,
            wrapped => new LevelBoostingWrapper(wrapped),
            writeTo);
    }
}
Run Code Online (Sandbox Code Playgroud)

3.将包装器添加到配置中

最后,在记录器配置中,应用包装器:

Log.Logger = new LoggerConfiguration()
    .WriteTo.Boosted(wt => wt.Console())
    .CreateLogger();

Log.Information("This will be unchanged");
Log.Warning("This will be boosted to Error");

Log.CloseAndFlush();
Run Code Online (Sandbox Code Playgroud)