.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)集成第三方日志工具的更多相关文章

  1. Log4j2日志框架集成Slf4j日志门面

    1.说明 本文介绍使用日志门面Slf4j打印日志, 底层日志实现使用Log4j2框架, 方便以后切换底层日志实现, Log4j2可以替换成Logback等. 2.依赖管理 在pom.xml依赖管理中导 ...

  2. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  3. 如何在通用权限管理系统中集成log4net日志功能

    开发人员都知道,在系统运行中要记录各种日志,自己写一个日志功能,无论是在效率还是功能扩展上来说都不是很好,目前大多用的是第三方的日志系统,其中一个非常有名,用的最多的就是log4net.下面是关于这个 ...

  4. asp.net core 集成 log4net 日志框架

    asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...

  5. .Java中的异常、断言、日志【草稿下,Log4j专题】

    (本章主要讲解Java里面比较核心的一块内容--异常处理,Java异常处理机制,一致都是比较复杂的一块,而很多时候如果写程序的时候能够适当地注意对应的一些异常处理情况,那么就会在开发过程节省一大部分时 ...

  6. 跟我一起学.NetCore之日志作用域及第三方日志框架扩展

    前言 上一节对日志的部分核心类型进行简单的剖析,相信现在再使用日志的时候,应该大概知道怎么一回事了,比如记录器是怎么来的,是如何将日志内容写入到不同目的地的等:当然还有很多细节没深入讲解,抽时间小伙伴 ...

  7. Go之Zap日志库集成Gin

    简介 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小.时间或间隔等来切割日志文件; ...

  8. 使用.NET 6开发TodoList应用(3)——引入第三方日志库

    需求 在我们项目开发的过程中,使用.NET 6自带的日志系统有时是不能满足实际需求的,比如有的时候我们需要将日志输出到第三方平台上,最典型的应用就是在各种云平台上,为了集中管理日志和查询日志,通常会选 ...

  9. Spring Boot(十)Logback和Log4j2集成与日志发展史

    一.简介 Java知名的日志有很多,比如:JUL.Log4j.JCL.SLF4J.Logback.Log4j2,那么这些日志框架之间有着怎样的关系?诞生的原因又是解决什么问题?下面一起来看. 1.1 ...

随机推荐

  1. webpack之傻瓜式教程

    接触webpack也有挺长一段时间了,公司的项目也是一直用着webpack在打包处理,但前几天在教新人的情况下,遇到了一个问题,那就是:尽管网上的webpack教程满天飞,但是却很难找到一个能让新人快 ...

  2. Js 原型和原型链

    Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...

  3. 前端学HTTP之字符集

    前面的话 HTTP报文中可以承载以任何语言表示的内容,就像它能承载图像.影片或任何类型的媒体那样.对HTTP来说,实体主体只是二进制信息的容器而已.为了支持国际性内容,服务器需要告知客户端每个文档的字 ...

  4. .net 分布式架构之分布式缓存中间件

    开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件  方便实现缓存的分布式,集群, ...

  5. CRL快速开发框架系列教程三(更新数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  6. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  7. ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results

    原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...

  8. 代码的坏味道(15)——冗余类(Lazy Class)

    坏味道--冗余类(Lazy Class) 特征 理解和维护类总是费时费力的.如果一个类不值得你花费精力,它就应该被删除. 问题原因 也许一个类的初始设计是一个功能完全的类,然而随着代码的变迁,变得没什 ...

  9. APEX:对object中数据进行简单处理?

    在Salesforce中,常常要对各种数据进行处理,已满足业务逻辑.本篇文章会介绍如何实现从object获取数据,然后将取得的数据进行一系列简单处理. 第一步:SongName__c 是一个新建的ob ...

  10. Android开发学习—— Broadcast广播接收者

    现实中:电台要发布消息,通过广播把消息广播出去,使用收音机,就可以收听广播,得知这条消息.Android中:系统在运行过程中,会产生许多事件,那么某些事件产生时,比如:电量改变.收发短信.拨打电话.屏 ...