有没有一种方法可以动态更改某些事件的日志级别?(也许按名称空间或谓词)
我正在寻找类似的东西,.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)但我真正想做的就是将Information事件的级别从Microsoft命名空间更改为Verbose。重要性较高的事件应保持原样。
编辑:
Nic*_*rdt 11
有可能,但并非完全简单,因此请紧紧抓住自己!
您需要在目标接收器周围创建一个包装器,而不是浓缩器。包装器将从日志记录管道接收事件,(相当便宜)创建具有相同属性的新事件,并将其转发到实际接收器:
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)
当然,决定要修改哪些事件的实际标准取决于您。
这个小扩展使设置包装器变得更加愉快:
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)
最后,在记录器配置中,应用包装器:
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)