日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用表达式自定义Serilog输出格式

發布時間:2023/12/4 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用表达式自定义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

Log.Logger?=?new?LoggerConfiguration().WriteTo.Console(new?ExpressionTemplate("[{@t:HH:mm:ss}?{@l:u3}?{SourceContext}]?{@m}\n{@x}")).CreateLogger(); Log.Information("公眾號“My?IO”!");

2.使用函數

ExpressionTemplate中可以使用下列函數:

FunctionDescription
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”。

Log.Logger?=?new?LoggerConfiguration().WriteTo.Console(new?ExpressionTemplate("{IndexOf(@m,'My?IO')}")).CreateLogger(); Log.Information("公眾號“My?IO”!");

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输出格式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。