.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组件的学习,在软件的设计方面学到了很多。也体会到了书本上很多看似没事找事的设计模式在实际中的应用。
更多内容欢迎访问我的博客:http://www.durow.vip
.NetCore中的日志(2)集成第三方日志工具的更多相关文章
- Log4j2日志框架集成Slf4j日志门面
1.说明 本文介绍使用日志门面Slf4j打印日志, 底层日志实现使用Log4j2框架, 方便以后切换底层日志实现, Log4j2可以替换成Logback等. 2.依赖管理 在pom.xml依赖管理中导 ...
- .NetCore中的日志(1)日志组件解析
.NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...
- 如何在通用权限管理系统中集成log4net日志功能
开发人员都知道,在系统运行中要记录各种日志,自己写一个日志功能,无论是在效率还是功能扩展上来说都不是很好,目前大多用的是第三方的日志系统,其中一个非常有名,用的最多的就是log4net.下面是关于这个 ...
- asp.net core 集成 log4net 日志框架
asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...
- .Java中的异常、断言、日志【草稿下,Log4j专题】
(本章主要讲解Java里面比较核心的一块内容--异常处理,Java异常处理机制,一致都是比较复杂的一块,而很多时候如果写程序的时候能够适当地注意对应的一些异常处理情况,那么就会在开发过程节省一大部分时 ...
- 跟我一起学.NetCore之日志作用域及第三方日志框架扩展
前言 上一节对日志的部分核心类型进行简单的剖析,相信现在再使用日志的时候,应该大概知道怎么一回事了,比如记录器是怎么来的,是如何将日志内容写入到不同目的地的等:当然还有很多细节没深入讲解,抽时间小伙伴 ...
- Go之Zap日志库集成Gin
简介 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小.时间或间隔等来切割日志文件; ...
- 使用.NET 6开发TodoList应用(3)——引入第三方日志库
需求 在我们项目开发的过程中,使用.NET 6自带的日志系统有时是不能满足实际需求的,比如有的时候我们需要将日志输出到第三方平台上,最典型的应用就是在各种云平台上,为了集中管理日志和查询日志,通常会选 ...
- Spring Boot(十)Logback和Log4j2集成与日志发展史
一.简介 Java知名的日志有很多,比如:JUL.Log4j.JCL.SLF4J.Logback.Log4j2,那么这些日志框架之间有着怎样的关系?诞生的原因又是解决什么问题?下面一起来看. 1.1 ...
随机推荐
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- session实现购物车
为实现简单的购物功能(购物车添加.账户查看.购物车商品删除.实时的购物商品数量及价格的计算显示.购物车商品数量可手动输入等),用session实现了一简单的以php语言为基础.连接MySQL数据库的购 ...
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件
系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...
- 苹果强制使用HTTPS传输了怎么办?——关于HTTPS,APP开发者必须知道的事
WeTest 导读 2017年1月1日起,苹果公司将强制使用HTTPS协议传输.本文通过对HTTPS基础原理和通信过程内容的讲解,介绍APP开发者在这个背景下的应对办法. 几周前,我们在<htt ...
- 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- Node.js:dgram模块实现UDP通信
1.什么是UDP? 这里简单介绍下,UDP,即用户数据报协议,一种面向无连接的传输层协议,提供不可靠的消息传送服务.UDP协议使用端口号为不同的应用保留其各自的数据传输通道,这一点非常重要.与TCP相 ...
- SQL Server2016升级前几点自检
SQL Server2016已经出来一段时间了,而且最新的SP1包也于2016年11月18日正式发布,各种新的特性推出让我们跃跃欲试.那么对于我们真实的业务环境,特别是生产环境要不要"跟风& ...
- 安装angular-cli
最近在学习angular2,并尝试用这个框架来做公司的一个新项目. 终于要开始开发了,等了1个多月. 因为第一次用这个新框架做项目,不太熟悉,就找了angular-cli这个脚手架来搭建项目. 安装了 ...
- 打破陈规抓痛点,H3 BPM10.0挑战不可能
高效益意味着相似的运营活动比竞争对手做得更好,而战略定位则意味着企业在运营活动中有区别于竞争对手的实施方式,即差异化竞争.在新经济体下,面对社会的变革.市场的竞争环境.不断攀升的成本压力,几乎没有企业 ...