.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
