繁体   English   中英

删除 Serilog 中的默认属性 Output

[英]Removing Default Properties in Serilog Output

在Serilog output 文件中,我看到默认是

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

谢谢

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

  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. 这是一篇很好的文章,更详细地解释了这一点

  4. 这是一些文档

从查看源代码看 ,它看起来不像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("}");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM