簡體   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