[英]How to get an enriched property in the output message when using 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.