如何配置 Serilog 输出模板以仅显示某些属性

How to configure Serilog output template for displaying only certain properties

我正在尝试配置 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();