asp.net core 5.0 中的 JsonConsole
Intro
asp.net core 5.0 中日誌新增了 JsonConsole
,還是輸出日誌到 Console
,但是會應用 Json
格式的一個 Formatter
把日誌格式化成 json 再輸出到控制檯
Sample
一起來看一個示例,以我的一個小項目爲例子來演示,默認的 console 日誌格式是多行的,不夠結構化,想要進行加工的話就會比較麻煩,不能很方便的進行加工和擴展,而 JSON 則是一種相對來說比較結構化的數據,相對來說進行擴展就比較方便了。
來看一下默認日誌輸出效果:
default console log如圖所示,一條日誌默認是兩行,第一行是日誌級別和日誌對應的 CategoryName
和 EventId
,第二行是日誌的具體內容
接着我們來使用一下 JsonConsole
,配置方式如下,可以在 Program.cs
調用(推薦)
再來看輸出的日誌:
json console log可以看到現在的日誌已經是 JSON 了,每一條日誌都是一個 JSON
Implement
它的實現在於一個 JsonConsoleFormatter
,是基於 System.Text.Json
來實現的 Json
格式化,
我們也可以實現自己的 ConsoleFormatter
來自定義 Console
的日誌格式,詳細實現可以參考:<https://github.com/dotnet/runtime/blob/v5.0.0/src/libraries/Microsoft.Extensions.Logging.Console/src/JsonConsoleFormatter.cs
擴展方法實現https://github.com/dotnet/runtime/blob/v5.0.0/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerExtensions.cs:
AddJsonConsole
擴展實現:
AddConsoleWithFormatter
實現:
AddConsole
實現:
More
在之前的版本,如果想要把日誌格式化成 JSON 輸出到控制檯,需要使用第三方的日誌框架把日誌序列化成 JSON,有了 JsonConsoleFormatter
之後我們就可以很方便的將日誌格式化成 JSON 輸出到控制檯了。
日誌輸出爲 JSON 之後,想要對日誌進行擴展和補充就會很容易,我們的應用目前使用的 .netcore 3.1,使用 nlog 把日誌格式化成 JSON 輸出到控制檯,再通過 Fluentd 收集到 es,收集的同時會把應用所在的 k8s 環境信息如containerName, podName,clusterName 等也 Patch 到日誌信息中
示例使用了默認的配置,我們也可以通過帶 action 的重載擴展方法自定義 Json 格式化的配置
Reference
https://docs.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-5.0?view=aspnetcore-5.0#console-logger-formatter
https://github.com/WeihanLi/SparkTodo