博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net Core 实践 - 使用log4net记录日志(2)
阅读量:6155 次
发布时间:2019-06-21

本文共 4012 字,大约阅读时间需要 13 分钟。

实现目标:将log4net的相关操作封装成一个 .Net Standard类库

demo地址:

Step 1 建立解决方案和处理项目相关配置

在当前解决方案下新建项目,选择 .Net Standard类库,命名“MyLogManager”

960070-20190116174618911-1098113898.png

nuget引用log4net,添加log4net.config配置,右键点击log4net.config,选择“属性”,修改log4net.config文件属性

刚添加的log4net.config文件属性可能如下图所示(生成操作为无,不复制到输出目录)
960070-20190116174635718-1343412081.png

需要修改成如下所示(生成操作 无 改为 内容复制到输出目录 - 选择 如果较新则复制

960070-20190116174644334-1265673462.png

960070-20190116174716962-289579696.png

重新生成解决方案后,在生成目录中就能看到log4net.config文件

Step 2 上代码

思路:两个StartLogger方法,在程序启动时启动该方法,一个方法自己配置处理,一个走默认

代码如下

public class MyLogManager    {        private static ILoggerRepository _loggerRepository;        ///         /// 启动logger        ///         /// repository名称        /// 配置文件名称        public static void StartLogger(string repository, string fileName)        {            _loggerRepository = LogManager.CreateRepository(repository);            XmlConfigurator.ConfigureAndWatch(_loggerRepository, new FileInfo(fileName));        }        ///         /// 启动logger        ///         public static void StartLogger()        {            _loggerRepository = LogManager.CreateRepository(nameof(MyLogManager));            XmlConfigurator.ConfigureAndWatch(_loggerRepository, new FileInfo("log4net.config"));        }        public static ILog GetMyLog
(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) { 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();        }

转载于:https://www.cnblogs.com/AlienXu/p/10278390.html

你可能感兴趣的文章
JavaAPI详解系列(1):String类(1)
查看>>
HTML条件注释判断IE<!--[if IE]><!--[if lt IE 9]>
查看>>
发布和逸出-构造过程中使this引用逸出
查看>>
Oracle执行计划发生过变化的SQL语句脚本
查看>>
使用SanLock建立简单的HA服务
查看>>
Subversion使用Redmine帐户验证简单应用、高级应用以及优化
查看>>
Javascript Ajax 异步请求
查看>>
DBCP连接池
查看>>
cannot run programing "db2"
查看>>
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>
Java基础学习总结(4)——对象转型
查看>>
BZOJ3239Discrete Logging——BSGS
查看>>
SpringMVC权限管理
查看>>
spring 整合 redis 配置
查看>>
cacti分组发飞信模块开发
查看>>
浅析LUA中游戏脚本语言之魔兽世界
查看>>
飞翔的秘密
查看>>
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>