.NetCore日志记录之自定义日志组件
2022-06-15 18:49:18 来源:易采站长站 作者:
一、前言
回顾:日志记录之日志核心要素揭秘
在上一篇中,我们通过学习了解在.net>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,目的是将指定的等级日志输出到控制台。所以我们创建一个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>
在创建了日志输出记录后,我们同时需要提供一个日志程序来增加和创建上面的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写入本地文件系统
四、总结
上文中,我们通过自定义的方式实现了根据日志等级将日志记录输出到指定目标的方式,在这种基础上,我们可以根据具体的需求做完善修改,实现自己的日志记录输出方式。
除了我们通过自定义的方式之外,我们也可以借用第三方日志框架组件程序进行使用,根据拓展方法进行调用,在后续中我们会使用第三方日志记录程序来实现日志记录的输出。
如果有不对的或不理解的地方,希望大家可以多多指正,提出问题,一起讨论,不断学习,共同进步。
官方源码 和 参考资料
本文项目源码下载
到此这篇关于.Net>
如有侵权,请发邮件到 gridf@126.com
最新图文推荐
相关文章
-
[Asp.Net Core] 浅谈Blazor Server Side
在2016年, 本人就开始了一个内部项目, 其特点就是用C#构建DOM树, 然后把DOM同步到浏览器中显示. 并且在一些小工程中使用. 3年下来, 效果很不错, 但因为是使用C#来构建控件树, 在没有特定2020-07-01
-
使用vs2019加.net core 对WeiApi的创建过程详解
vs2019创建webapi 1.创建新的项目 2.选择.NET CORE的ASP .NET CORE WEB应用程序 3.定义项目名称和存放地点 4.选择API创建项目 5.删除原本的无用的类 6.添加新的方法类 7.设置路由 using Microsoft.AspNe2020-07-03
-
[Asp.Net Core]用Blazor Server Side实现图片验证码
关于Blazor 由于在国内, Blazor一点都不普及, 在阅读此文前, 建议读者先翻看我之前写的随笔, 了解Blazor Server Side的特点. 在一段时间内, 我会写一些解说分析型的 "为什么选择 Blazor Server2020-07-01
-
.Net Core中使用ExceptionFilter过滤器的方法
.Net Core中有各种Filter,分别是AuthorizationFilter、ResourceFilter、ExceptionFilter、ActionFilter、ResultFilter。可以把他们看作是.Net Core自带的AOP的扩展封装。 今天来看其中的一种:ExceptionFilter(用于2020-03-03