实现目标:将log4net的相关操做封装成一个 .Net Standard类库
demo地址:https://github.com/PuzzledAlien/log4net_demo/tree/master/DotNetCoreConsole_V2git
在当前解决方案下新建项目,选择 .Net Standard类库,命名“MyLogManager”
github
nuget引用log4net,添加log4net.config配置,右键点击log4net.config,选择“属性”,修改log4net.config文件属性
刚添加的log4net.config文件属性可能以下图所示(生成操做为无,不复制到输出目录)
优化
须要修改为以下所示(生成操做 无 改成 内容
,复制到输出目录 - 选择 若是较新则复制
)
pwa
从新生成解决方案后,在生成目录中就能看到log4net.config文件code
思路:两个StartLogger方法,在程序启动时启动该方法,一个方法本身配置处理,一个走默认
代码以下orm
public class MyLogManager { private static ILoggerRepository _loggerRepository; /// <summary> /// 启动logger /// </summary> /// <param name="repository">repository名称</param> /// <param name="fileName">配置文件名称</param> public static void StartLogger(string repository, string fileName) { _loggerRepository = LogManager.CreateRepository(repository); XmlConfigurator.ConfigureAndWatch(_loggerRepository, new FileInfo(fileName)); } /// <summary> /// 启动logger /// </summary> public static void StartLogger() { _loggerRepository = LogManager.CreateRepository(nameof(MyLogManager)); XmlConfigurator.ConfigureAndWatch(_loggerRepository, new FileInfo("log4net.config")); } public static ILog GetMyLog<T>(T t) { return LogManager.GetLogger(_loggerRepository.Name, t.GetType()); } public static ILog GetMyLog(object obj) { return LogManager.GetLogger(_loggerRepository.Name, obj.GetType()); } public static ILog GetMyLog(Type type) { return LogManager.GetLogger(_loggerRepository.Name, type); } }
封装以后,调用代码会比初版本的稍微精简blog
static void TestV1() { MyLogManager.MyLogManager.StartLogger("DotNetCoreConsole_V2", "log4net.config"); var log = MyLogManager.MyLogManager.GetMyLog(typeof(Program)); const int numberOfCycles = 20000; var sw = Stopwatch.StartNew(); for (var i = 0; i < numberOfCycles; i++) { log.InfoFormat("testNum: {0} ", i); } sw.Stop(); Console.WriteLine(); Console.WriteLine("Ellapsed: {0}, numPerSec: {1}", sw.ElapsedMilliseconds, numberOfCycles / (sw.ElapsedMilliseconds / (double)1000)); Console.ReadKey(); }
思考:可不能够去掉StartLogger这行代码呢?能够。
实现以下get
public class NullLogManager { private static ILoggerRepository _loggerRepository; private static ILoggerRepository LoggerRepository { get { if (_loggerRepository != null) { return _loggerRepository; } _loggerRepository = LogManager.CreateRepository(nameof(NullLogManager)); XmlConfigurator.ConfigureAndWatch(_loggerRepository, new FileInfo("log4net.config")); return _loggerRepository; } } public static ILog GetMyLog<T>(T t) { return LogManager.GetLogger(LoggerRepository.Name, t.GetType()); } public static ILog GetMyLog(object obj) { return LogManager.GetLogger(LoggerRepository.Name, obj.GetType()); } public static ILog GetMyLog(Type type) { return LogManager.GetLogger(LoggerRepository.Name, type); } public static ILog GetMyLog() { return LogManager.GetLogger(LoggerRepository.Name, nameof(GetMyLog)); } }
调用代码可再次精简string
static void TestNullLogManager() { var log = MyLogManager.NullLogManager.GetMyLog(typeof(Program)); const int numberOfCycles = 20000; var sw = Stopwatch.StartNew(); for (var i = 0; i < numberOfCycles; i++) { log.InfoFormat("testNum: {0} ", i); } sw.Stop(); Console.WriteLine(); Console.WriteLine("Ellapsed: {0}, numPerSec: {1}", sw.ElapsedMilliseconds, numberOfCycles / (sw.ElapsedMilliseconds / (double)1000)); Console.ReadKey(); }