.NetCore中的日志(2)集成第三方日志工具
.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组件的学习,在软件的设计方面学到了很多。也体会到了书本上很多看似没事找事的设计模式在实际中的应用。