华为mate7高配版和标准版的区别,夜栈全集,齐学启
实现目标:将log4net的相关操作封装成一个 .net standard类库
demo地址:https://github.com/puzzledalien/log4net_demo/tree/master/dotnetcoreconsole_v2
在当前解决方案下新建项目,选择 .net standard类库,命名“mylogmanager”
nuget引用log4net,添加log4net.config配置,右键点击log4net.config,选择“属性”,修改log4net.config文件属性
刚添加的log4net.config文件属性可能如下图所示(生成操作为无,不复制到输出目录)
需要修改成如下所示(生成操作 无 改为 内容
,复制到输出目录 - 选择 如果较新则复制
)
重新生成解决方案后,在生成目录中就能看到log4net.config文件
思路:两个startlogger方法,在程序启动时启动该方法,一个方法自己配置处理,一个走默认
代码如下
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); } }
封装之后,调用代码会比第一版本的稍微精简
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这行代码呢?可以。
实现如下
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)); } }
调用代码可再次精简
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(); }
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论