.NET 日志系統(tǒng)-3 結(jié)構(gòu)化日志和集中日志服務(wù)
系列文章
-
認(rèn)識(shí).NET 日志系統(tǒng) https://www.cnblogs.com/ZYPLJ/p/17663487.html
-
.NET 認(rèn)識(shí)日志系統(tǒng)-2 https://www.cnblogs.com/ZYPLJ/p/17667970.html
結(jié)構(gòu)化日志
結(jié)構(gòu)化日志比普通文本更利于日志的分析,結(jié)構(gòu)化日志的格式為json格式。
Serilog
使用步驟
-
NLog也可以配置結(jié)構(gòu)化日志,不過配置麻煩,推薦用Serilog。
-
NuGet安裝:Serilog.AspNetCore
-
Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() //最低級(jí)別設(shè)置為Debug .Enrich.FromLogContext() .WriteTo.Console(new JsonFormatter()) .CreateLogger(); builder.AddSerilog();
-
要記錄的結(jié)構(gòu)化數(shù)據(jù)通過占位符來輸出:
logger.LogWarning("新增用戶{@person}",new {Id=3,Name="zack"});
-
同樣可以輸出到文件、數(shù)據(jù)庫、MongoDB等。
代碼實(shí)現(xiàn)
接文章日志系統(tǒng)文章-1和-2(前2篇文章),代碼一樣,只需要在注入的時(shí)候添加第三步即可。
services.AddLogging(logBuilder =>
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug() //最低級(jí)別設(shè)置為Debug
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.CreateLogger();
logBuilder.AddSerilog();
});
效果展示
模擬用戶
通過第4步占位符實(shí)現(xiàn)結(jié)構(gòu)化數(shù)據(jù)
首先在Test2中創(chuàng)建一個(gè)User類
class User
{
public string Name { get; set; }
public string Email { get; set; }
}
然后模擬一下注冊(cè)用戶
public void Test()
{
User user = new User { Name = "admin", Email = "123@qq.com" };
_logger.LogDebug("注冊(cè)一個(gè)用戶{@person}",user);
}
效果展示
集中化日志
集群化部署環(huán)境中,有N多服務(wù)器,如果每個(gè)服務(wù)器都把日志記錄到本地文件,不便于查詢、分析。需要把日志保存到集中化的日志服務(wù)器中。
- 使用NLog、Serilog等可以把日志記錄到數(shù)據(jù)庫、MongoDB等地方,就可以實(shí)現(xiàn)“結(jié)構(gòu)化、集中日志服務(wù)”,不過需要自己編寫日志分析程序。
- 公有云廠商一般都提供了日志云服務(wù),都帶有分析功能,都有對(duì)應(yīng)Serilog插件,即使沒有提供,開發(fā)一個(gè)插件也不麻煩。
- 如果沒有用云平臺(tái)或者想自己控制日志服務(wù)們可以使用Exceptionless或者ELK等。
Exceptionless
在線版有些功能需要收費(fèi),可以去官網(wǎng)用docker將Exceptionless部署到自己的服務(wù)器中。
官網(wǎng):https://exceptionless.com/
找到Docs頁面,列表最小面的Self Hosting中就有Docker部署的方法。
試用步驟:
Exceptionless https://be.exceptionless.io/
- 到Exceptionless官網(wǎng)注冊(cè)、登錄后,新建一個(gè)項(xiàng)目,安裝向?qū)л斎牍久?、?xiàng)目名后,網(wǎng)站會(huì)給出一個(gè)apikey。
- 項(xiàng)目Nuget安裝Serilog的Exceptionless插件:Serilog.Sinks.Exceptionless。
- 在程序最開始加上一句ExceptionlessClient.Default.Startup("拿到的apikey"),然后Serilog的配置加上一句:.WriteTo.Exceptionless()
創(chuàng)建項(xiàng)目
選擇項(xiàng)目
馬賽克部分為apikey,然后根據(jù)提示安裝Nuget
Install-Package Exceptionless.AspNetCore
代碼實(shí)現(xiàn)
其實(shí)上面的官網(wǎng)網(wǎng)站講得很清楚了,在程序的開頭加上
ExceptionlessClient.Default.Startup("apikey");
然后接上第二步安裝Serilog.Sinks.Exceptionless
,繼續(xù)第三步注入的時(shí)候添加
services.AddLogging(logBuilder =>
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug() //最低級(jí)別設(shè)置為Debug
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.WriteTo.Exceptionless() //添加這行
.CreateLogger();
logBuilder.AddSerilog();
});
效果展示
總結(jié)
普通項(xiàng)目用NLog輸出到文本文件即可,根據(jù)需要設(shè)定過濾、分類規(guī)則
集群部署的項(xiàng)目用Serilog+集中式日志服務(wù),需要記錄結(jié)構(gòu)化日志,再進(jìn)行結(jié)構(gòu)化輸出
參考鏈接
- 【.NET 6教程,.Net Core 2022視頻教程,楊中科主講】 https://www.bilibili.com/video/BV1pK41137He/?p=49&share_source=copy_web&vd_source=fce337a51d11a67781404c67ec0b5084
每日一道面試題
-
在.Net中所有可序列化的類都被標(biāo)記為_____?
答:[serializable]
-
在.Net托管代碼中我們不用擔(dān)心內(nèi)存漏洞,這是因?yàn)橛辛薩_____?文章來源:http://www.zghlxwxcb.cn/news/detail-687531.html
答:GC。文章來源地址http://www.zghlxwxcb.cn/news/detail-687531.html
到了這里,關(guān)于.NET 日志系統(tǒng)-3 結(jié)構(gòu)化日志和集中日志服務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!