.NetCore中的日誌(2)整合第三方日誌工具

durow發表於2016-09-09

.NetCore中的日誌(2)整合第三方日誌工具

 

0x00 在.NetCore的Logging元件中整合NLog

上一篇討論了.NetCore中日誌框架的結構,這一篇討論一下.NetCore的Logging元件中第三方日誌工具的整合。只要按照Logging元件中相關介面的要求提供相應的實現(ILogger、ILoggerProvider),然後把實現的ILoggerProvider加入到LoggerFactory就可以使用了,非常方便。這裡以NLog為例進行實踐。關於NLog的詳細教程可以參考https://github.com/NLog/NLog/wiki,園子裡也很多這方面的文章。這裡主要說整合原理。

NLog本身提供了一套完整的日誌記錄框架,由NLog.Logger實現日誌記錄,通過配置檔案或程式碼配置路由規則(rules)把不同name的Logger路由到不同的輸出目標(target)上。

NLog整合到Logging元件中,一般不會做過多的配置,只是把Log方法的內容轉發到NLog中處理。日誌過濾(NLog中叫路由)和輸出格式配置都在NLog中配置,Logging元件僅僅起到一個日誌內容轉發的作用。

NLog的Logger在整合到.NetCore的Logging元件中時需要做以下事情:

1、包裝NLog.Logger為NLogLogger,並實現ILogger介面。

把NLog.Logger包裝為NlogLogger,實現ILogger介面。在實現Log方法時把Logging元件中Log方法的引數轉化為NLog.Logger中Log方法的引數,然後呼叫NLog.Logger的Log方法輸出日誌。

此外,在NLog中是有自己的日誌等級的,因此在記錄日誌時需要把.NetCore的Logging元件中定義的日誌等級轉換為NLog中的日誌等級。

2、實現ILoggerProvider介面

 

3、新增擴充套件方法方便把ILoggerProvider加入到LoggerFactory中。

有一點需要注意,NLog官方給出的示例(https://github.com/NLog/NLog.Extensions.Logging)還是像以往一樣在類中呼叫

LogManager.GetCurrentClassLogger();

方法獲取Logger,這是不科學的,實際使用中還是應該通過依賴注入的方式獲取Logger。通過在建構函式引數中注入ILogger<Class>()的方式獲取Logger,與在Class中呼叫GetCurrentClassLogger()方法獲取的Logger的Name是相同的,都可以正常在NLog配置檔案中匹配路由規則。

0x01 整合自己的日誌工具

瞭解了.NetCore中Logging框架,我們也可以嘗試自己寫一個日誌記錄器並整合到Logging元件中。下面我們自己寫一個往文字文件中記錄日誌的工具,以下內容只是用於演示,實際編寫自己的日誌記錄工具需要更加嚴謹。

首先需要實現ILogger介面,Log方法直接把傳入的資訊按格式輸出到文字檔案:

實現ILoggerProvider介面:

寫一個擴充套件方法方便新增:

這樣在Startup中我們就可以加入需要的所有Logger了,混合了原生的、第三方的、以及自己寫的。

有興趣看詳細程式碼的可以到:

https://github.com/durow/NetCoreStudy/tree/master/src/LoggingStudy

0x02 寫在最後

關於.NetCore的Logging元件就寫到這裡了,Logging元件的設計很容易整合第三方日誌工具。瞭解Logging元件如何實現對各個不同日誌工具的整合對於實際開發中日誌記錄基本是沒有幫助的:(,畢竟有如此豐富的選擇,我們幾乎不需要開發自己的日誌記錄工具。不過通過對Logging元件的學習,在軟體的設計方面學到了很多。也體會到了書本上很多看似沒事找事的設計模式在實際中的應用。

 


更多內容歡迎訪問我的部落格:http://www.durow.vip

相關文章