删除 Serilog 输出中的默认属性

Removing Default Properties in Serilog Output

在一个文件的Serilog输出中,我看到默认是

{
    "Timestamp": "2016-05-28T21:21:59.0932348+08:00",
    "Level": "Information",
    "MessageTemplate": "Processed {@Number} records in {@Time} ms",
    "Properties": {
        "Number": 500,
        "Time": 120
    }
}

有没有办法删除时间戳、级别、消息模板和属性,以便我只剩下这些

{
    "Number": 500,
    "Time": 120
}

Log.Logger 是这样分配的

Log.Logger = new LoggerConfiguration()
    .WriteTo.Sink(new FileSink(ConfigurationManager.AppSettings["serilogPath"], new JsonFormatter(), null))
    .CreateLogger();

谢谢

source code 来看,JsonFormatter 似乎不支持跳过这些默认属性。您可以创建自己的 ITextFormatter 来满足您的需求。这是一个简单的示例(不应在生产中使用,因为它不进行任何转义——仅用于演示目的):

public class SOFormatter : ITextFormatter
{
    public void Format(LogEvent logEvent, TextWriter output)
    {
        output.Write("{");
        foreach (var p in logEvent.Properties)
        {
            output.Write("\"{0}\" : {1}, ", p.Key, p.Value);
        }
        output.Write("}");
    }
}

这个问题很老,但现在有一些简单的解决方案,所以我想分享一下。

  1. 确保你有这个Serilog.Expressions Nuget Package(至少3.3版)

  2. 您现在可以在代码中配置ExpressionTemplate,这里是一个例子:

    Log.Logger = new LoggerConfiguration()
        .WriteTo.Console(formatter: new ExpressionTemplate("{ {@t, @mt, @r, @l: if @l = 'Information' then undefined() else @l, @x, ..@p} }\n"))
        .CreateLogger();
    
  3. 或者你可以在appSettings.json中配置ExpressionTemplate,像这样

    {
      "Name": "Console",
      "Args": {
        "formatter": {
          "type": "Serilog.Templates.ExpressionTemplate, Serilog.Expressions",
          "template": "[{@t:HH:mm:ss} {@l:u3} {Coalesce(SourceContext, '<none>')}] {@m}\n{@x}"
        }
      }
    }
    

备注

  1. appSettings 中的 formatter 单词是方法参数的名称,因此根据您使用的接收器可能会有所不同。
    例如,我使用 Mongodb Sink,所以参数的名称对我来说是 mongoDBJsonFormatter

  2. 我在这里不解释ExpressionTemplate的语法,您可以参考以下链接了解更多信息。

  3. 这里 a good article 更详细地解释了这一点

  4. 这里是Some documentation