# .NET 日誌系統-3 結構化日誌和集中日誌服務 # 系列文章 - [認識.NET 日誌系統 ](https://www.cnblogs.com/ZYPLJ/p/17663487.html) https://www.cnblogs.com/ZYPLJ/p/17663487.html - [.NE ...
.NET 日誌系統-3 結構化日誌和集中日誌服務
系列文章
結構化日誌
結構化日誌比普通文本更利於日誌的分析,結構化日誌的格式為json格式。
Serilog
使用步驟
-
NLog也可以配置結構化日誌,不過配置麻煩,推薦用Serilog。
-
NuGet安裝:Serilog.AspNetCore
-
Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() //最低級別設置為Debug .Enrich.FromLogContext() .WriteTo.Console(new JsonFormatter()) .CreateLogger(); builder.AddSerilog();
-
要記錄的結構化數據通過占位符來輸出:
logger.LogWarning("新增用戶{@person}",new {Id=3,Name="zack"});
-
同樣可以輸出到文件、資料庫、MongoDB等。
代碼實現
接文章日誌系統文章-1和-2(前2篇文章),代碼一樣,只需要在註入的時候添加第三步即可。
services.AddLogging(logBuilder =>
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug() //最低級別設置為Debug
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.CreateLogger();
logBuilder.AddSerilog();
});
效果展示
模擬用戶
通過第4步占位符實現結構化數據
首先在Test2中創建一個User類
class User
{
public string Name { get; set; }
public string Email { get; set; }
}
然後模擬一下註冊用戶
public void Test()
{
User user = new User { Name = "admin", Email = "[email protected]" };
_logger.LogDebug("註冊一個用戶{@person}",user);
}
效果展示
集中化日誌
集群化部署環境中,有N多伺服器,如果每個伺服器都把日誌記錄到本地文件,不便於查詢、分析。需要把日誌保存到集中化的日誌伺服器中。
- 使用NLog、Serilog等可以把日誌記錄到資料庫、MongoDB等地方,就可以實現“結構化、集中日誌服務”,不過需要自己編寫日誌分析程式。
- 公有雲廠商一般都提供了日誌雲服務,都帶有分析功能,都有對應Serilog插件,即使沒有提供,開發一個插件也不麻煩。
- 如果沒有用雲平臺或者想自己控制日誌服務們可以使用Exceptionless或者ELK等。
Exceptionless
線上版有些功能需要收費,可以去官網用docker將Exceptionless部署到自己的伺服器中。
找到Docs頁面,列表最小面的Self Hosting中就有Docker部署的方法。
試用步驟:
Exceptionless https://be.exceptionless.io/
- 到Exceptionless官網註冊、登錄後,新建一個項目,安裝嚮導輸入公司名、項目名後,網站會給出一個apikey。
- 項目Nuget安裝Serilog的Exceptionless插件:Serilog.Sinks.Exceptionless。
- 在程式最開始加上一句ExceptionlessClient.Default.Startup("拿到的apikey"),然後Serilog的配置加上一句:.WriteTo.Exceptionless()
創建項目
選擇項目
馬賽克部分為apikey,然後根據提示安裝Nuget
Install-Package Exceptionless.AspNetCore
代碼實現
其實上面的官網網站講得很清楚了,在程式的開頭加上
ExceptionlessClient.Default.Startup("apikey");
然後接上第二步安裝Serilog.Sinks.Exceptionless
,繼續第三步註入的時候添加
services.AddLogging(logBuilder =>
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug() //最低級別設置為Debug
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.WriteTo.Exceptionless() //添加這行
.CreateLogger();
logBuilder.AddSerilog();
});
效果展示
總結
普通項目用NLog輸出到文本文件即可,根據需要設定過濾、分類規則
集群部署的項目用Serilog+集中式日誌服務,需要記錄結構化日誌,再進行結構化輸出
參考鏈接
- 【.NET 6教程,.Net Core 2022視頻教程,楊中科主講】 https://www.bilibili.com/video/BV1pK41137He/?p=49&share_source=copy_web&vd_source=fce337a51d11a67781404c67ec0b5084
每日一道面試題
-
在.Net中所有可序列化的類都被標記為_____?
答:[serializable]
-
在.Net托管代碼中我們不用擔心記憶體漏洞,這是因為有了______?
答:GC。