烟台网站推广哪家好,dw做的网站怎么上传图片,湖北省建设教育协会网站,精品课程网站建设意义动手造轮子#xff1a;给微软的日志框架写一个基于委托的日志提供者Intro微软的日志框架现在已经比较通用#xff0c;有时候我们不想使用外部的日志提供者#xff0c;但又希望提供一个比较简单的委托就可以实现日志记录#xff0c;于是就有了后面的探索和实现。Solution基于… 动手造轮子给微软的日志框架写一个基于委托的日志提供者Intro微软的日志框架现在已经比较通用有时候我们不想使用外部的日志提供者但又希望提供一个比较简单的委托就可以实现日志记录于是就有了后面的探索和实现。Solution基于委托的 LoggerProvider 实现代码:自定义 Logger微软的日志框架中记录日志是通过 ILogger 来做的扩展支持其他日志框架的时候也需要实现相应的 ILogger 来适配ILoggerProvider 会需要实现创建 ILogger 的接口 CreateLogger(stringcategoryName) 所以我们可以先来实现对应的 ILogger实现如下这里的实现简单化处理默认处理所有级别的日志如果要设定日志级别可以通过日志的 Fliter 来做这里就不做检查和限制了private class DelegateLogger : ILogger
{private readonly string _categoryName;private readonly Actionstring, LogLevel, Exception, string _logAction;public DelegateLogger(string categoryName, Actionstring, LogLevel, Exception, string logAction){_categoryName categoryName;_logAction logAction;}public void LogTState(LogLevel logLevel, EventId eventId, TState state, Exception exception, FuncTState, Exception, string formatter){if (null ! _logAction){var msg formatter(state, exception);_logAction.Invoke(_categoryName, logLevel, exception, msg);}}public bool IsEnabled(LogLevel logLevel){return true;}public IDisposable BeginScopeTState(TState state){return NullScope.Instance;}
}
自定义 ILoggerProvider有了 ILogger 之后接着我们来定义我们的 ILoggerProvider这里我们针对 Logger 名称CategoryName做了区分如果不关注 Logger 名称的话也可以使用同一个 Logger 这样就不需要下面的并发字典了只用一个 ILogger 对象就可以了可以根据自己的需要进行定制实现代码如下[ProviderAlias(Delegate)]
public class DelegateLoggerProvider : ILoggerProvider
{private readonly Actionstring, LogLevel, Exception, string _logAction;private readonly ConcurrentDictionarystring, DelegateLogger _loggers new ConcurrentDictionarystring, DelegateLogger();public DelegateLoggerProvider(Actionstring, LogLevel, Exception, string logAction){_logAction logAction;}public void Dispose(){_loggers.Clear();}public ILogger CreateLogger(string categoryName){return _loggers.GetOrAdd(categoryName, category new DelegateLogger(category, _logAction));}
}
定义扩展方法为了方便使用我们需要定义两个扩展方法来优化我们使用的方式定义 ILoggerFactory 的扩展方法/// summary
/// AddDelegateLoggerProvider
/// /summary
/// param nameloggerFactoryloggerFactory/param
/// param namelogActionlogAction/param
/// returnsloggerFactory/returns
public static ILoggerFactory AddDelegateLogger(this ILoggerFactory loggerFactory, Actionstring, LogLevel, Exception, string logAction)
{loggerFactory.AddProvider(new DelegateLoggerProvider(logAction));return loggerFactory;
}
定义 ILoggingBuilder 的扩展方法public static ILoggingBuilder AddDelegateLogger(this ILoggingBuilder loggingBuilder,Actionstring, LogLevel, Exception, string logAction)
{return loggingBuilder.AddProvider(new DelegateLoggerProvider(logAction));
}
使用示例ILoggerFactory loggerFactory new LoggerFactory();
//loggerFactory.AddConsole();
loggerFactory.AddDelegateLogger((category, logLevel, exception, msg) {Console.WriteLine(${category}:[{logLevel}] {msg}\n{exception});}
);
日志输出效果如下Referencehttps://github.com/WeihanLi/WeihanLi.Common/blob/dev/src/WeihanLi.Common/Logging/MicrosoftLoggingLoggerExtensions.cshttps://github.com/WeihanLi/WeihanLi.Common/blob/dev/samples/DotNetCoreSample/Program.cs#L83