.net core 自带一个基础的logger框架Microsoft.Extensions.Logging。
微软默认实现了Microsoft.Extensions.Logging.Console.dll。控制台的日志输出和Microsoft.Extensions.Logging.Debug.dll调试输出。
下面我们写一个我们自己的本地文件输出模块demo,简单理解一下自带的这个logger系统。
logger框架主要几个类:LoggerFactory,Logger,LoggerProvider。
看名字就很好理解,都不需要解释。
实现我们自己的file logger只需要实现logger,loggerProvider即可。
第一步:入口。
loggerFactory.AddFile(this.Configuration.GetSection("FileLogging"));
为LoggerFactory扩张一个方法,提供增加日志写文件方式的入口。相关的配置来自appsettings.json
![](https://i-blog.csdnimg.cn/blog_migrate/5f94c2fecb4ccb2f76f50c965d122407.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/50828477840f9be8f01bb82af691c7d1.gif)
1 public static class FileLoggerExtensions 2 { 3 //add 日志文件创建规则,分割规则,格式化规则,过滤规则 to appsettings.json 4 public static ILoggerFactory AddFile(this ILoggerFactory factory, IConfiguration configuration) 5 { 6 return AddFile(factory, new FileLoggerSettings(configuration)); 7 } 8 public static ILoggerFactory AddFile(this ILoggerFactory factory, FileLoggerSettings fileLoggerSettings) 9 { 10 factory.AddProvider(new FileLoggerProvider(fileLoggerSettings)); 11 return factory; 12 } 13 }
第二步:实现我们的logger提供程序,实现ILoggerProvider接口
public class FileLoggerProvider : ILoggerProvider, Idisposable
关键方法CreateLogger,创建真正写日志的logger。对当前的logger可以做适当的缓存,配置logger
![](https://i-blog.csdnimg.cn/blog_migrate/5f94c2fecb4ccb2f76f50c965d122407.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/50828477840f9be8f01bb82af691c7d1.gif)
1 public class FileLoggerProvider : ILoggerProvider, IDisposable 2 { 3 FileLoggerSettings _configuration; 4 readonly ConcurrentDictionary<string, InitLoggerModel> _loggerKeys = new ConcurrentDictionary<string, InitLoggerModel>(); 5 readonly ConcurrentDictionary<string, FileLogger> _loggers = new ConcurrentDictionary<string, FileLogger>(); 6 7 public FileLoggerProvider(FileLoggerSettings configuration) 8 { 9 _configuration = configuration; 10 _configuration.ChangeToken.RegisterChangeCallback(p => 11 { 12 //appsettings.json changed. reload settings. 13 _configuration.Reload(); 14 15 //update loggers settings form new settings 16 foreach (var item in this._loggers.Values) 17 { 18 InitLoggerModel model = new InitLoggerModel(); 19 InitLoggerSettings(item.Name, model); 20 InitLogger(model, item); 21 } 22 23