在 .NET Core 中使用 DiagnosticSource 記錄跟蹤信息(2)

學(xué)習(xí),也是一個(gè)總結(jié)的過(guò)程,對(duì)此,我們也許可以總結(jié)出來(lái)一個(gè)比較重要的信息就是:通過(guò) Diagnostics 的命名空間變化,由 Microsoft 變?yōu)榱?System, 我們可以看到 Diagnostics 對(duì)于我們的應(yīng)用程序來(lái)說(shuō)變得更加重要了。

由于 EventSource 只支持 Windows,所以在全新的 .NET Core 中,它已經(jīng)被悄悄的取代了,下面我們來(lái)看一下全新的 DiagnosticSource。

在 .NET Core 中 .NET 團(tuán)隊(duì)設(shè)計(jì)了一個(gè)全新的?DiagnosticSource,新的?DiagnosticSource?非常的簡(jiǎn)單,它允許你在生產(chǎn)環(huán)境記錄豐富的 payload 數(shù)據(jù),然后你可以在另外一個(gè)消費(fèi)者可以消費(fèi)感興趣的記錄,是不是聽(tīng)著有點(diǎn)懵逼?沒(méi)關(guān)系,等會(huì)我再詳細(xì)說(shuō)。

我們先來(lái)說(shuō)說(shuō)?DiagnosticSource?和上面的?EventSource?的區(qū)別,他們的架構(gòu)設(shè)計(jì)有點(diǎn)類(lèi)似,主要區(qū)別是?EventSource?它記錄的數(shù)據(jù)是可序列化的數(shù)據(jù),會(huì)被在進(jìn)程外消費(fèi),所以要求記錄的對(duì)象必須是可以被序列化的。而?DiagnosticSource?被設(shè)計(jì)為在進(jìn)程內(nèi)處理數(shù)據(jù),所以通過(guò)它可以拿到更加豐富的一些數(shù)據(jù)信息,它支持非序列化的對(duì)象,比如?HttpContext?,?HttpResponseMessage?等。如果你想在?EventSource?中獲取?DiagnosticSource?中的事件數(shù)據(jù),你可以通過(guò)?DiagnosticSourceEventSource?這個(gè)對(duì)象來(lái)進(jìn)行數(shù)據(jù)橋接。

下面我們來(lái)看一下在代碼中如何使用?DiagnosticSource對(duì)象。

在這之前我們需要了解另外一個(gè)對(duì)象?DiagnosticListener,DiagnosticListener?從命名上來(lái)看它是一個(gè)監(jiān)聽(tīng)診斷信息的對(duì)象,它確實(shí)是一個(gè)用來(lái)接收事件的類(lèi),在 .NET Core 中?DiagnosticSource?它其實(shí)是一個(gè)抽象類(lèi),定義了記錄事件日志所需要的方法,那么我們?cè)谑褂玫臅r(shí)候就需要使用具體的對(duì)象,DiagnosticListener?就是?DiagnosticSource?的默認(rèn)實(shí)現(xiàn),明白了吧。

好了,現(xiàn)在我們來(lái)看一下如何使用吧。

生成 Diagnostic 日志記錄

如何生成 Diagnostic 日志記錄呢?首先,我們需要?jiǎng)?chuàng)建一個(gè)?DiagnosticListener?對(duì)象,比如:

privatestaticDiagnosticSource httpLogger =newDiagnosticListener("System.Net.Http");

DiagnosticListener?參數(shù)中的名稱即為需要監(jiān)聽(tīng)的事件(組件)名稱,這個(gè)名稱在以后會(huì)被用來(lái)被它的消費(fèi)者所訂閱使用。

DiagnosticSource?其核心只包含了兩個(gè)方法,分別是 :

boolIsEnabled(stringname)voidWrite(stringname,objectvalue);

那么然后我們可以這樣來(lái)調(diào)用:

if(httpLogger.IsEnabled("RequestStart")){? ? httpLogger.Write("RequestStart",new{ Url="http://clr", Request=aRequest });}

IsEnabled(string param1)?這個(gè)方法用來(lái)判斷是否有消費(fèi)者注冊(cè)了當(dāng)前的事件(組件)名稱監(jiān)聽(tīng),通常有消費(fèi)者關(guān)心了相關(guān)數(shù)據(jù),我們才會(huì)進(jìn)行事件記錄。

Write(string param1,object param2)?這個(gè)方法用來(lái)向 DiagnosticSource 中寫(xiě)入日志記錄,param1?和上面一樣用來(lái)指定名稱的,也就是所向指定名稱中寫(xiě)入數(shù)據(jù),param2?即為寫(xiě)入的 payloads 數(shù)據(jù),你可以使用 匿名類(lèi)型來(lái)向?param2?中寫(xiě)入數(shù)據(jù),這樣會(huì)方便很多。

這樣,我們就已經(jīng)把 Diagnostic 事件日志寫(xiě)入到 DiagnosticSource中了,是不是很簡(jiǎn)單? 我們?cè)倏匆幌氯绾芜M(jìn)行消費(fèi)(監(jiān)聽(tīng))這些事件信息。

監(jiān)聽(tīng) Diagnostic 日志記錄

在監(jiān)聽(tīng) Diagnostic 日志記錄之前你需要知道你要關(guān)心的事件數(shù)據(jù)名稱,那么如果僅僅是在代碼中把?DiagnosticListeners?都寫(xiě)死到監(jiān)聽(tīng)的消費(fèi)者代碼中的話,這樣就太不靈活了,所以這里設(shè)計(jì)了一個(gè)機(jī)制用來(lái)發(fā)現(xiàn)中那些在運(yùn)行時(shí)被激活的DiagnosticListeners。

你可以使用?DiagnosticListener.AllListeners?來(lái)獲取一個(gè)?IObservable對(duì)象,IObservable接口大家應(yīng)該都不陌生了吧,然后通過(guò)其Subscribe方法進(jìn)行OnNext“回調(diào)”關(guān)心的事件數(shù)據(jù)。


通過(guò)這種方式,我們就可以在觸發(fā)回調(diào)的之后做一些我們想要的操作了。是不是發(fā)現(xiàn)上面的那種寫(xiě)法有點(diǎn)麻煩和丑陋,ASP.NET 團(tuán)隊(duì)考慮到了,所以為我們封裝了一個(gè)適配器的庫(kù)來(lái)方便我們進(jìn)行監(jiān)聽(tīng)的一些操作,你可以通過(guò)打 attribute 標(biāo)記的方式來(lái)進(jìn)行相關(guān)事件的訂閱,有興趣的同學(xué)可以看下這個(gè)(Microsoft.Extensions.DiagnosticAdapte) NuGet 包。現(xiàn)在我們已經(jīng)可以拿到數(shù)據(jù)了,有同學(xué)可能會(huì)說(shuō)在生產(chǎn)環(huán)境數(shù)據(jù)這么多,這些數(shù)據(jù)我存到哪里,又怎么樣來(lái)處理呢,我不可能一條一條的來(lái)找性能在哪里吧,OK,我們接著往下看。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 16,208評(píng)論 2 11
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,410評(píng)論 6 13
  • 老板交代了一項(xiàng)“無(wú)法完成”的任務(wù),怎么辦 我們可以把任務(wù)分成“看似無(wú)法完成”和“確實(shí)無(wú)法完成”兩種,分別討論解決方...
    思念的詩(shī)閱讀 448評(píng)論 0 0
  • 六天前,我從山東坐火車(chē)來(lái)到了西安。中間相隔八百多公里,我背著一個(gè)背包只身孤影。 促成這次西安之行,是我一個(gè)相交五年...
    V山野笨拙閱讀 251評(píng)論 5 3

友情鏈接更多精彩內(nèi)容