前言

回顾:日志记录之日志核心要素揭秘

在上一篇中,我们通过学习了解在.net core 中内置的日志记录中的几大核心要素,在日志工厂记录器(ILoggerFactory)中实现将日志记录提供器(ILoggerProvider)对象都可以集成到Logger对象组合中,这样的话,我们就可以通过基于ILoggerProvider自定义日志记录程序集成到Logger中,再创建写日志定义Ilogger,自定义日志记录器实现日志的输出方式,这样实现自定义日志记录工具。

在这个过程中,日志记录器ILogger中的Log()方法会记录执行日志,通过在ILoggerFactory产生的是ILogger类型(也就是我们最终使用的Logger),其Log()方法是依次调用Logger中包含的LoggerInformation[]数组中的ILogger。而ILoggerProvider产生的为各类不同的XxxLogger(也就是上面说的Logger中的LoggerInformation数组包含的如ConsoleLogger、DebugLogger),其Log()方法是把日志写到具体的目标上去,所以我们自定义的日志程序也可以在日志记录器工厂中实现添加日志程序,达到将日志写到具体目标的作用。

所以下文我们通过自定义的方式实现ILoggerILoggerProvider两个接口来实现我们自己想要的日志记录程序,实现自定义输出目标方式。(下文只是简单的根据接口自定义实现输出日志记录到控制台的demo)

开始

自定义Logger

创建一个自定义Logger,目的是将指定的等级日志输出到控制台。所以我们创建一个ExtensionLogger的类,指定输出的日志等级。所以在这之前,我们需要配置一下输入日志的等级,因此我们需要增加一个等级的配置类ExtensionsConfiguration

ExtensionsConfiguration中,

public class ExtensionsConfiguration
{/// <summary>/// 日志等级/// </summary>public LogLevel LogLevel { get; set; } = LogLevel.Warning;
}

再自定义日志记录类ExtensionLogger,实现接口ILogger,

public class ExtensionsLogger : ILogger
{private readonly ExtensionsConfiguration _config;public ExtensionsLogger(ExtensionsConfiguration extensionsConfiguration){_config = extensionsConfiguration;}public IDisposable BeginScope<TState>(TState state){return null;}public bool IsEnabled(LogLevel logLevel){return logLevel == _config.LogLevel;}public void Log<TState>(LogLevel logLevel, EventId eventId, TState state,Exception exception, Func<TState, Exception, string> formatter){if (!IsEnabled(logLevel)){return;}Console.WriteLine($" {logLevel} - {eventId.Id} : " + formatter(state, exception));}
}

根据ILogger接口实现,其中实现Log()接口方法,将日志输出到指定目标,这里是输出到控制台,在设置了日志等级的情况条件下,当满足条件后,才能输出对应的日志。

自定义LoggerProvider

在创建了日志输出记录后,我们同时需要提供一个日志程序来增加和创建上面的Logger记录,所以我们通过自定义日志提供器类ExtensionsLoggerProvider,实现ILoggerProvider类。

public class ExtensionsLoggerProvider : ILoggerProvider
{private readonly ExtensionsConfiguration _config;public ExtensionsLoggerProvider(ExtensionsConfiguration extensionsConfiguration){_config = extensionsConfiguration;}public ILogger CreateLogger(string categoryName){return new ExtensionsLogger(_config);}public void Dispose(){}
}

基于ILoggerProvider接口实现自定义类,实现方法CreateLogger,来创建上面的日志记录。

使用

在Startup.cs中,通过Configure方法调用配置日志记录。

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env , ILoggerFactory loggerFactory){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}// 注入ILogggerFactory,然后配置参数//添加日志等级loggerFactory.AddProvider(new ExtensionsLoggerProvider(new ExtensionsConfiguration { LogLevel= LogLevel.Warning }));app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}

在此之前,我们可以清空默认的配置,然后根据日志等级,在控制台中输出对应的日志记录。

效果

在等级为Information情况下,输出效果如下:

这个就是我们通过自定义的方式实现的按日志等级输出的记录。

拓展

写入本地文件

第一步:为LoggerFactory扩张一个方法,提供增加日志写文件方式的入口。相关的配置来自appsettings.json

第二步:实现我们的logger提供程序,实现ILoggerProvider接口,关键方法CreateLogger,创建真正写日志的logger。对当前的logger可以做适当的缓存,配置logger

第三步:实现我们的logger,实现ILogger接口。真正将log写入file。

这里可以参考另一篇资料 :.Net Core Logger 实现log写入本地文件系统

总结

1.  上文中,我们通过自定义的方式实现了根据日志等级将日志记录输出到指定目标的方式,在这种基础上,我们可以根据具体的需求做完善修改,实现自己的日志记录输出方式。

2.  除了我们通过自定义的方式之外,我们也可以借用第三方日志框架组件程序进行使用,根据拓展方法进行调用,在后续中我们会使用第三方日志记录程序来实现日志记录的输出。

3. 如果有不对的或不理解的地方,希望大家可以多多指正,提出问题,一起讨论,不断学习,共同进步。

4.搜索关注公众号【DotNet技术谷】--回复【自定义】,可获取本篇文章的源码。

基于.NetCore3.1系列 —— 日志记录之自定义日志组件相关推荐

  1. 基于.NetCore3.1系列 —— 日志记录之初识Serilog

    前言 对内置日志系统的整体实现进行了介绍之后,可以通过使用内置记录器来实现日志的输出路径.而在实际项目开发中,使用第三方日志框架(如:Log4Net.NLog.Loggr.Serilog.Sentry ...

  2. 基于.NetCore3.1系列 —— 认证授权方案之授权揭秘 (下篇)

    一.前言 回顾:基于.NetCore3.1系列 -- 认证授权方案之授权揭秘 (上篇) 在上一篇中,主要讲解了授权在配置方面的源码,从添加授权配置开始,我们引入了需要的授权配置选项,而不同的授权要求构 ...

  3. python:继承日志模块生成自定义日志

    1 继承日志模块生成自定义日志 from __future__ import absolute_importimport os import sys import time import dateti ...

  4. oracle数据库日志记录内容,oracle日志记录方式

    oracle日志记录模式 oracle 日志记录模式(LOGGING.FORCE LOGGING.NOLOGGING) 1.LOGGING(默认):当创建一个数据库对象时将记录日志信息到联机重做日志文 ...

  5. 基于.NetCore3.1系列 —— 日志记录之日志配置揭秘

    前言 在项目的开发维护阶段,有时候我们关注的问题不仅仅在于功能的实现,甚至需要关注系统发布上线后遇到的问题能否及时的查找并解决.所以我们需要有一个好的解决方案来及时的定位错误的根源并做出正确及时的修复 ...

  6. 基于.NetCore3.1系列 —— 日志记录之日志核心要素揭秘

    前言 在上一篇中,我们已经了解了内置系统的默认配置和自定义配置的方式,在学习了配置的基础上,我们进一步的对日志在程序中是如何使用的深入了解学习.所以在这一篇中,主要是对日志记录的核心机制进行学习说明. ...

  7. java aop注解日志记录_springMVC自定义注解,用AOP来实现日志记录的方法

    需求背景 最近的一个项目,在项目基本完工的阶段,客户提出要将所有业务操作的日志记录到数据库中,并且要提取一些业务的关键信息(比如交易单号)体现在日志中. 为了保证工期,在查阅了资料以后,决定用AOP+ ...

  8. 数据库MySQL/mariadb知识点——日志记录(2)二进制日志

    二进制日志 记录已提交事务导致数据改变或潜在导致数据改变的SQL语句,通过"重放"日志文件中的事件来生成数据副本,不依赖存储引擎类型. 开启二进制日志,默认是关闭的,二进制日志和数 ...

  9. RN TSX基于react-native-vector-icons和iconfont.cn 的生成自定义Icon组件的工具

    基于react-native-vector-icons与 iconfont 的生成自定义Icon组件的工具 前言 准备工作 使用 task-iconfont.js 实现 前言 原本项目中使用了 rea ...

最新文章

  1. STL---string
  2. SprintBoot中如何构造Bean原理分析
  3. 第八次课作业(采购管理、信息与配置管理)
  4. pip源更换为清华源_kali2020更换国内的源
  5. 获取现成的参考文献格式方法
  6. 不会这些基础命令,白做运维了
  7. 趣文:程序员/开发人员的真实生活
  8. c++线程数量的限制
  9. 游戏行业的人工智能设计:AI的设计和实施
  10. count(id)count(1)count(*)count(字段)
  11. MySQL的一些概念笔记
  12. 标准SQL注入入侵语句
  13. js 字符串,数组扩展
  14. Svn内外网切换技巧
  15. 在 LaTeX 中插入图片
  16. OpenGL的3D场景模型大作业
  17. 【微信小程序】横向/纵向布局(98/100)
  18. matlab冲激响应不变发,matlab实验七冲激响应不变法IIR数字滤波器设计
  19. 尚硅谷 硅谷外卖_关于多样性,硅谷未能想到与众不同
  20. 仿微信发送位置(高德地图定位)

热门文章

  1. MAX10 ADC的一些基知识
  2. 浅谈Java多线程同步机制之同步块(方法)——synchronized
  3. hdu_1728_逃离迷宫(bfs)
  4. 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
  5. Yii框架里用grid.CGridView调用pager扩展不显示最后一页按钮的解决
  6. Android学习笔记(1)
  7. 【知识分享】异步调用与多线程的区别
  8. window 2008 和 windows vista windows 7 安装 MSMQ
  9. Rsa2加密报错java.security.spec.InvalidKeySpecException的解决办法
  10. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(2)...