上一篇讨論了.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)還是像以往一樣在類中調用
方法擷取Logger,這是不科學的,實際使用中還是應該通過依賴注入的方式擷取Logger。通過在構造函數參數中注入ILogger<Class>()的方式擷取Logger,與在Class中調用GetCurrentClassLogger()方法擷取的Logger的Name是相同的,都可以正常在NLog配置檔案中比對路由規則。
了解了.NetCore中Logging架構,我們也可以嘗試自己寫一個日志記錄器并內建到Logging元件中。下面我們自己寫一個往文本文檔中記錄日志的工具,以下内容隻是用于示範,實際編寫自己的日志記錄工具需要更加嚴謹。
首先需要實作ILogger接口,Log方法直接把傳入的資訊按格式輸出到文本檔案:
實作ILoggerProvider接口:
寫一個擴充方法友善添加:
這樣在Startup中我們就可以加入需要的所有Logger了,混合了原生的、第三方的、以及自己寫的。
有興趣看詳細代碼的可以到:
https://github.com/durow/NetCoreStudy/tree/master/src/LoggingStudy
關于.NetCore的Logging元件就寫到這裡了,Logging元件的設計很容易內建第三方日志工具。了解Logging元件如何實作對各個不同日志工具的內建對于實際開發中日志記錄基本是沒有幫助的:(,畢竟有如此豐富的選擇,我們幾乎不需要開發自己的日志記錄工具。不過通過對Logging元件的學習,在軟體的設計方面學到了很多。也體會到了書本上很多看似沒事找事的設計模式在實際中的應用。
更多内容歡迎通路我的部落格:http://www.durow.vip