【问题标题】:Removing Default Properties in Serilog Output删除 Serilog 输出中的默认属性
【发布时间】:2016-05-28 14:24:47
【问题描述】:

在一个文件的 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();

谢谢

【问题讨论】:

  • 它可能取决于接收器和格式化程序。您能否说明您正在使用哪个接收器以及如何配置它?
  • @PatrickSteele 我更新了细节

标签: c# logging serilog


【解决方案1】:

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("}");
    }
}

【讨论】:

  • 完美,正是我想要的。谢谢
  • 嗨,我正在使用 Serilog mongo pkg。是否可以从生成的 mongo 文档中删除默认属性“MessageTemplate”?谢谢
  • @pregoli 嘿,这有点晚了,但你绝对可以做到。您必须编辑原始源代码并删除生成该键值的那部分代码。
【解决方案2】:

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

  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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多