.Net Core Logger 实现log写入本地文件系统
.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
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
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 }, null);
24 }
25 public ILogger CreateLogger(string categoryName)
26 {
27 var loggerKey = this._loggerKeys.GetOrAdd(categoryName, p =>
28 {
29 InitLoggerModel model = new InitLoggerModel();
30 InitLoggerSettings(categoryName, model);
31 return model;
32 });
33 var key = loggerKey.FileDiretoryPath + loggerKey.FileNameTemplate;
34 return this._loggers.GetOrAdd(key, p =>
35 {
36 var logger = new FileLogger(categoryName);
37 InitLogger(loggerKey, logger);
38 return logger;
39 });
40 }
41
42 private static void InitLogger(InitLoggerModel model, FileLogger logger)
43 {
44 logger.FileNameTemplate = model.FileNameTemplate;
45 logger.FileDiretoryPath = model.FileDiretoryPath;
46 logger.MinLevel = model.MinLevel;
47 }
48
49 class InitLoggerModel
50 {
51 public LogLevel MinLevel { get; set; }
52 public string FileDiretoryPath { get; set; }
53 public string FileNameTemplate { get; set