我正在尝试将Serilog
配置为能够推送属性,但仅在日志中显示其中一些。
当前,我的serilog通过以下方式配置:
Log.Logger = new LoggerConfiguration().Enrich.FromLogContext()
.WriteTo.File(logpath)
.WriteTo
.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Properties} {Message}")
.CreateLogger();
假设我有一个名为MyProperty
的属性,我只希望它在日志中显示:
string MyProperty="some value";
string MyOtherProperty="some other value";
LogContext.Push("MyProperty",MyProperty);
LogConetext.Push("MyOtherProperty",MyOtherProperty);
[当我开始记录Properties
部分时,如下所示:
`{SourceContext= "[something]",Myproperty=[...],MyOtherProperty=[...]}`
我如何将模板设置为仅显示MyProperty
(甚至不显示LogContext)?
我曾这样尝试而无济于事:
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Properties:MyProperty} {Message}")
无论您是否写Enrich.FromLogContext()
,似乎默认都添加了LogContext。这是一个解决方法,您可以使用下面的自定义扩展程序来丰富记录器,该自定义扩展程序将从EventLog中删除这些属性。
public class SerilogContextEnricher : ILogEventEnricher
{
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
logEvent.RemovePropertyIfPresent("ActionId");
logEvent.RemovePropertyIfPresent("ActionName");
logEvent.RemovePropertyIfPresent("RequestId");
logEvent.RemovePropertyIfPresent("RequestPath");
logEvent.RemovePropertyIfPresent("CorrelationId");
logEvent.RemovePropertyIfPresent("MyOtherProperty");
}
}
如下配置:
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.With<SerilogContextEnricher>()
.WriteTo.File("logs/log.txt")
.WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Properties} {Message}")
.CreateLogger();