.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組件的學習,在軟件的設計方面學到了很多。也體會到了書本上很多看似沒事找事的設計模式在實際中的應用。