基于.NetCore3.1系列 —— 日志记录之自定义日志组件
2020-08-11 22:15
2586 查看
一、前言
在上一篇中,我们通过学习了解在.net core 中内置的日志记录中的几大核心要素,在日志工厂记录器(
ILoggerFactory)中实现将日志记录提供器(
ILoggerProvider)对象都可以集成到
Logger对象组合中,这样的话,我们就可以通过基于
ILoggerProvider自定义日志记录程序集成到
Logger中,再创建写日志定义
Ilogger,自定义日志记录器实现日志的输出方式,这样实现自定义日志记录工具。
在这个过程中,日志记录器
ILogger中的Log()方法会记录执行日志,通过在
ILoggerFactory产生的是
ILogger类型(也就是我们最终使用的
Logger),其Log()方法是依次调用
Logger中包含的
LoggerInformation[]数组中的
ILogger。而
ILoggerProvider产生的为各类不同的XxxLogger(也就是上面说的
Logger中的
LoggerInformation数组包含的如ConsoleLogger、
DebugLogger),其Log()方法是把日志写到具体的目标上去,所以我们自定义的日志程序也可以在日志记录器工厂中实现添加日志程序,达到将日志写到具体目标的作用。
所以下文我们通过自定义的方式实现
ILogger、
ILoggerProvider两个接口来实现我们自己想要的日志记录程序,实现自定义输出目标方式。(下文只是简单的根据接口自定义实现输出日志记录到控制台的demo)
二、开始
2.1 自定义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()接口方法,将日志输出到指定目标,这里是输出到控制台,在设置了日志等级的情况条件下,当满足条件后,才能输出对应的日志。
2.2 自定义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,来创建上面的日志记录。
2.3 使用
在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(); }); }
在此之前,我们可以清空默认的配置,然后根据日志等级,在控制台中输出对应的日志记录。
2.4 效果
在等级为
Information情况下,输出效果如下:
这个就是我们通过自定义的方式实现的按日志等级输出的记录。
三、拓展
3.1 写入本地文件
第一步:为LoggerFactory扩张一个方法,提供增加日志写文件方式的入口。相关的配置来自appsettings.json
第二步:实现我们的logger提供程序,实现ILoggerProvider接口,关键方法CreateLogger,创建真正写日志的logger。对当前的logger可以做适当的缓存,配置logger
第三步:实现我们的logger,实现ILogger接口。真正将log写入file。
这里可以参考网友的资料 :.Net Core Logger 实现log写入本地文件系统
四、总结
相关文章推荐
- php基于自定义函数记录log日志方法
- SpringMVC中基于AOP的自定义注解记录日志
- spring aop基于自定义注解做日志记录
- 基于log4net的日志组件扩展分装,实现自动记录交互日志 XYH.Log4Net.Extend
- 小巧的日志记录组件 - 开源研究系列文章
- SpringMVC 基于注解的自定义AOP实现日志记录
- 基于SSM利用SpringAOP切面及自定义注解 记录每次操作记录(操作日志 同理)
- 一种基于自定义代码记录用户访问日志在Sharepoint网站的应用方法!
- 基于log4net的日志组件扩展封装,实现自动记录交互日志 XYH.Log4Net.Extend(微服务监控)...
- 一种基于自定义代码记录用户访问日志在Sharepoint网站的应用方法!
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
- C#Log4net日志记录组件的使用
- Android自定义组件系列【14】——Android5.0按钮波纹效果实现
- JSF2自定义组件编程系列 第六部分
- 通用日志记录组件实现
- MVC使用 Elmah 日志记录组件
- 基于AJAX和JSF打造丰富的因特网组件 系列列表
- discuzx3.2自定义积分操作日志,discuzx积分二次开发完全记录
- Android自定义组件系列【3】——自定义ViewGroup实现侧滑
- Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例