使用表达式自定义Serilog输出格式
Serilog是.NET Core中常用的結構化日志類庫,透過logging API可以輕松的記錄應用程式中對象屬性,方便快速進行logging內容進行查詢與分析,并將其記錄內容通過指定方式輸出。
今天,介紹一個Nuget包Serilog.Expressions,它可以更容易地控制Serilog事件如何格式化輸出。
功能介紹
Serilog.Expressions包含用于文本格式化的ExpressionTemplate類。ExpressionTemplate實現了ITextFormatter,因此它可以與任何基于文本的Serilog接收器一起工作,包括控制臺、文件、調試窗口和電子郵件。
1.使用參數
ExpressionTemplate中可以使用下列參數:
SourceContext - ILogger< T > 中T對應的類型名
@t - 事件時間
@m - 格式化后的消息
@mt - 原始的消息模板
@l - 事件級別
@x - 異常
@p - 傳入參數的字典
@i - 事件Id
2.使用函數
ExpressionTemplate中可以使用下列函數:
| Coalesce(p0, p1, [..pN]) | 返回第一個定義的非空參數。 |
| Concat(s0, s1, [..sN]) | 連接兩個或多個字符串。 |
| Contains(s, t) | 測試字符串“s”是否包含子字符串“t”。 |
| ElementAt(x, i) | 按名稱“i”檢索“x”的屬性,或按數字索引“i”檢索“x”的數組元素。 |
| EndsWith(s, t) | 測試字符串“s”是否以子字符串“t”結尾。 |
| IndexOf(s, t) | 返回字符串“s”中子字符串“t”的第一個索引,如果子字符串未出現,則返回-1。 |
| IndexOfMatch(s, p) | 返回字符串“s”中正則表達式“p”的第一個匹配項的索引,如果正則表達式不匹配,則返回-1。 |
| IsMatch(s, p) | 測試正則表達式“p”是否與字符串“s”匹配。 |
| IsDefined(x) | 如果表達式“x”有值,包括“null”,則返回“true”;如果“x”未定義,則返回“false”。 |
| LastIndexOf(s, t) | 返回字符串“s”中子字符串“t”的最后一個索引,如果子字符串未出現,則返回-1。 |
| Length(x) | 返回字符串或數組的長度。 |
| Now() | 返回“DateTimeOffset.Now”。 |
| Rest() | 在“ExpressionTemplate”中,返回一個對象,該對象包含模板或事件消息中未引用的事件屬性。 |
| Round(n, m) | 將數字“n”四舍五入到“m”小數位。 |
| StartsWith(s, t) | 測試字符串“s”是否以子字符串“t”開頭。 |
| Substring(s, start, [length]) | 返回從“start”到字符串結尾的字符串“s”的子字符串,或返回“length”字符的子字符串. |
| TagOf(o) | 返回捕獲對象的“TypeTag”字段。 |
| ToString(x, [format]) | 將“x”轉換為字符串,如果“x”是“IFormattable”,則應用格式字符串“format”。 |
| TypeOf(x) | 返回一個描述“x”類型的字符串:如果“x”是標量且非空,或是“array”、“object”、“dictionary”、“null”或“undefined”,則返回.NET類型名。 |
| Undefined() | 顯式Undefined的值。 |
| UtcDateTime(x) | 將“DateTime”或“DateTimeOffset”轉換為UTC“DateTime”。 |
3.條件語句
可以使用{#if <表達式>}和{#end}有條件地顯示輸出。條件{#if}也支持{#else if <表達式>}和 {#else}。例如,如果日志包含密碼則不輸出,避免泄露敏感數據:
Log.Logger?=?new?LoggerConfiguration().WriteTo.Console(new?ExpressionTemplate("{#if?@p['Password']?is?not?null?}?不輸出敏感數據?{#else}?{@m}?{#end}\n")).CreateLogger();var?user?=?new?{?Name?=?"張三",?Password?=?"xxx"?}; Log.Information("登錄信息:{@Name}?{@Password}",?user.Name,user.Password); Log.Information("登錄信息:{@Name}?",?user.Name);4.循環
使用{#each}為@p這樣的對象的所有成員重復執行。
Log.Logger?=?new?LoggerConfiguration().WriteTo.Console(new?ExpressionTemplate("{#each?name,?value?in?@p}?{name}?=?{value}\n{#end}")).CreateLogger();var?user?=?new?{?Name?=?"張三",?Password?=?"xxx"?}; Log.Information("登錄信息:{@Name}?{@Password}",?user.Name,user.Password);結論
這里只是介紹了Serilog.Expressions部分常用功能,更多內容可以去https://github.com/serilog/serilog-expressions了解。
歡迎關注我的個人公眾號”My IO“
總結
以上是生活随笔為你收集整理的使用表达式自定义Serilog输出格式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Blazor 数据绑定开发指南
- 下一篇: 比较两个字符串的相似度算法