簡體   English   中英

Serilog 在輸出中顯示屬性名稱

[英]Serilog show the property name in the output

如果我有這個:

logger.Information("this is a message with {property_name}", "value");

何我輸出這個:

this is a message with property_name = value

代替:

this is a message with value

通過 Serilog 寫入的日志消息的顯示輸出是由您正在寫入的 Sink 使用的格式化程序完成的。 每個接收器都可以使用不同的格式化程序,並且可以不同地表示輸出。

您要求的不是默認格式化程序可以做的事情,因此您必須編寫自己的自定義文本格式化程序,然后告訴 Sink 使用您的格式化程序而不是默認格式化程序。

格式化輸出

Serilog 提供了幾種輸出格式化機制。

  • 格式化純文本
  • 格式化 JSON
  • 自定義文本格式化程序

使用structured logging ,想法是擺脫這種形式的公式化格式(它往往會被正則表達式解析),而是使用有意義的消息。

如果你正在使用 Serilog 做這樣的包或屬性列表,一種技術是做這樣的事情:

Log.ForContext("property_name", propertyValue).Information("this is a message")

然后確保您在outputTemplate中使用Properties令牌,例如

var mt = "{LogLevel:u3} {SourceContext} {Message:l} {Properties}{NewLine}{Exception}"

並在配置 Sink 時使用它:

 .WriteTo.Console(outputTemplate: mt)

我認為你做不到。

你可以做你現在做的,但使用明確定義的參數,並得到你所要求的

logger.Information("this is a message with property_name = {property_name}", "value");

或者在什么地方使用非渲染格式化程序

logger.Information("this is a message with {property_name}", "value");

將輸出 JSON

{
    "message": "this is a message with {property_name}"
    "property_name" : "value"
}

如果您想要屬性的名稱,我能想到的最快方法是CallerMemberName

它是您應用於函數調用的可選字符串參數的屬性。 它是在 .NET Framework 4.5 之后才添加的。 而且我認為它與 INotifyPropertyChanged 結合用於此用途幾乎是添加的:

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")  
    {  
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }  

屬性名稱字符串是接口工作的基礎。 該界面幾乎是 MVVM 的基礎,因此與 WPF 和 UWP 緊密相關。 幾十年來,“引發事件”功能一直是標准功能 - 有時它們甚至只標記為受保護。

只要對 Logging 的調用有圍繞它的函數,您也可以輕松使用它。

如果您的問題是“如何覆蓋此日志系統的連接規則?”:字符串連接。 String.Fomat()或普通的舊 + 運算符。 如果你給它完整的字符串來以你想要的精確格式登錄,它什么也做不了,只能給你你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM