Asp.Net Core中利用Seq组件展示结构化日志功能
在一次.Net Core小項目的開發(fā)中,掌握的不夠深入,對日志記錄并沒有好好利用,以至于一出現(xiàn)異常問題,都得跑動服務(wù)器上查看,那時一度懷疑自己肯定沒學(xué)好,不然這一塊日志不可能需要自己扒服務(wù)器日志來查看,果然,很多東西沒掌握,至此,花點時間看了下日志的相關(guān)操作。利用日志服務(wù)來查看日志數(shù)據(jù)。
本文地址:https://www.cnblogs.com/CKExp/p/9246788.html
本文Demo的地址:https://gitee.com/530521314/LogPanel.git?
一、日志記錄的原則
日志是為了方便我們觀察應(yīng)用程序是否正常運行,也是當(dāng)運行不正常是,能夠快速找到出現(xiàn)問題,定位問題的方式。
有幾條日志記錄原則是我們大多都得遵循的:
1、日志記錄清晰,內(nèi)容得讓我們能夠知道應(yīng)用程序運行正?;蜻\行不正常下能夠有關(guān)鍵信息指明哪里出問題了。
2、不要過度記錄,一些場景下我們需要預(yù)判是否需要記錄日志信息,我們能夠控制日志記錄的數(shù)量,同樣,日志內(nèi)容,要精簡記錄,無關(guān)緊要的文字,廢話等無需加入。
3、控制日志記錄級別,或許在一個日志級別下記錄了很多信息,可是其中的部分信息才是最為重要的,當(dāng)調(diào)高一個記錄級別,這部分最為重要的信息就展示出來了,那就直接調(diào)高級別吧。
4、隱私保護(hù),日志雖然是讓開發(fā)運維人員看到,可是我們也不能所有信息都記錄下來,用戶的隱私信息我們得保護(hù)好。
?
二、內(nèi)置日志組件
Asp.Net Core中內(nèi)置了日志組件,功能也很強(qiáng)大,首先來個簡單示例:
直接使用內(nèi)置日志功能,無需在startup中加入另外的代碼。
在調(diào)試框下看到輸出的日志信息。
開始控制日志記錄級別:
在StartUp下,對內(nèi)置日志組件做一些處理,在配置文件中將日志記錄的級別提高到Information級別:
appsetting.json文件中,將LogLevel的默認(rèn)級別設(shè)為Information,這樣一來在之前的示例中_logger.LogDebug將失去作用。
對于異常來講,出現(xiàn)異常,日志肯定得記錄下來,不然出現(xiàn)異常,直接拋出,那還要日志有什么用呢。
異常信息加載出來。
出現(xiàn)異常,攔截異常,記錄日志信息,不單單在這里,在Filter或是幾個中間件中,都能夠記錄下來,此處不在多討論。
?
三、第三方日志組件
盡管微軟已經(jīng)內(nèi)置了日志記錄組件,但是一些第三方組件或許是我們中意的,在性能上、記錄方式上、操作上等等,如Log4Net、Logger、NLog和Serilog 等。結(jié)構(gòu)化的日志使得我們閱讀日志也更加輕松點。
在此,我利用Serilog組件來替換內(nèi)置的日志組件,添加相應(yīng)的依賴包(Serilog.Extensions.Logging和Serilog.Sinks.Literate)。
然后來更新Startup類,令Serilog組件開始發(fā)揮它的作用。
盡管可以在Program中加入Serilog組件,在這里,我將只在StartUp類中更改代碼,為了代碼統(tǒng)一存放,對于組件加入有三種方式:
方式一:在StartUp初始化完畢加入進(jìn)來,利用Log.Logger的全局性,在整個應(yīng)用程序中發(fā)揮作用,而不需要在各處聲明注入。
其中的?.WriteTo.Seq("http://localhost:5341")是為了后面加入Seq組件而提前寫入的,可以忽略。
在應(yīng)用程序中的使用方式是直接使用Log.Logger寫入即可,如在HomeController的Contact方法中,利用且只能利用這種方式寫入,當(dāng)想用最開始那種方式注入時,在LoggerFactory中并沒有SerilogProvider,因為我們并沒有把Serilog加入到LoggerFactory中,這也使得Serilog和內(nèi)置日志出現(xiàn)共存的局面,并可以通過兩種方式使用日志功能。
利用這種方式下的日志輸出?! ?/p>
? ?方式二:在ConfigureServices中將Serilog加入到LoggerFactory中,通過統(tǒng)一的擴(kuò)展方式加入進(jìn)來,利用Action委托指定Serilog組件,其中允許我們對Serilog進(jìn)行相關(guān)設(shè)置。
這種方式下,我們需要將Logger通過依賴注入的形式加入進(jìn)來,先來看下是否加入到了LoggerFactory中
加入進(jìn)來了,并完成了日志的輸出。
?
方式三:和方式二一樣都是加入到LoggerFactory中,但是直接利用的是Serilog提供的擴(kuò)展方法AddSerilog加入進(jìn)來。
Serilog組件同源加入進(jìn)來了,輸出結(jié)果就不展示了和方式二一樣的。
具體Serilog的非常優(yōu)秀的功能就不介紹了,請看Serilog的官方介紹?https://github.com/serilog
?
四、Seq組件
到了本文的主題——Seq組件,通過網(wǎng)頁UI的形式將日志展現(xiàn)出來,內(nèi)容更加多樣化,并賦予了更多功能日志搜索。
首先,安裝Seq組件,Seq下載地址:https://getseq.net/Download
本地開發(fā)情形下是免費使用的,如果需要在生產(chǎn)環(huán)境中使用,需要商業(yè)許可(你懂的,money).在目前的版本中,4.2是只能夠在windows下跑,也就是說我們?nèi)绻窃趙indows下開發(fā),在測試時可以借助這個方便的查看日志信息,按照給定的安裝步驟完成安裝。
在應(yīng)用程序中,我們通過Nuget管理Serilog.Sinks.Seq包,該組件隸屬于Serilog旗下。Seq默認(rèn)的端口是利用5341端口,如果我們想要使用其它端口,我們可以更改在應(yīng)用程序中的地址
以上一節(jié)的方式三為例,在其中加入一行.WriteTo.Seq(“http://localhost:5341”)便可指定Seq服務(wù)器地址。
在本地windows運行起來看下,啟動Seq服務(wù)器,當(dāng)然,你這里或許需要配置一些賬號密碼之類的,都是小問題。
啟動應(yīng)用程序,并進(jìn)入那些寫了日志的方法中,日志信息已經(jīng)進(jìn)來了,我們可以查看這些日志信息,并通過日志搜索功能搜索。
在這里要說明一下,同時也在Seq組件的網(wǎng)站中也寫明了。使用這些方式都可以直接使用Seq組件,第三方組件也不是必須的,直接利用Asp.Net Core的內(nèi)置日志組件一樣可以使用Seq組件。
可是,Linux下可以嗎? 假如我的開發(fā)環(huán)境在Linux下豈不是不行?,F(xiàn)在有一個預(yù)覽版5.0的,在Docker Hub中有Seq的鏡像,雖然是預(yù)覽版,可是我還是想試試。
Docker Hub中Seq鏡像地址:https://docs.getseq.net/v5.0/docs/docker
現(xiàn)在,開始Linux中弄起來。
首先完成鏡像的爬取,之后會自動啟動該鏡像內(nèi)部的服務(wù)。我們直接輸入地址訪問即可。默認(rèn)地址ip:5341端口
docker run -e ACCEPT_EULA=Y -p 5341:80 datalust/seq:latest頁面有了,Linux下看來也是可以的了,把應(yīng)用程序通過Jenkins上都發(fā)布成功了,可是訪問出現(xiàn)問題,Docker外部端口無法映射到內(nèi)部端口,糟心,可是應(yīng)該不是大問題,就此也就不弄日志信息的展示了。
至此,日志相關(guān)的一系列知識簡單帶過,關(guān)鍵是Seq那個可視化日志界面,很nice。
本文地址:https://www.cnblogs.com/CKExp/p/9246788.html
本文Demo的地址:https://gitee.com/530521314/LogPanel.git
推薦大家使用更好的Exceptionless:
.NET Core微服務(wù)之基于Exceptionless實現(xiàn)分布式日志記錄
原文地址:https://www.cnblogs.com/CKExp/p/9246788.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的Asp.Net Core中利用Seq组件展示结构化日志功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .netcore 整合 log4net
- 下一篇: Apache SkyWalking的架构