.Net Core 实践 - 使用log4net记录日志(2)
实现目标:将log4net的相关操作封装成一个 .Net Standard类库
demo地址:https://github.com/PuzzledAlien/log4net_demo/tree/master/DotNetCoreConsole_V2
Step 1 建立解决方案和处理项目相关配置
在当前解决方案下新建项目,选择 .Net Standard类库,命名“MyLogManager”

nuget引用log4net,添加log4net.config配置,右键点击log4net.config,选择“属性”,修改log4net.config文件属性
刚添加的log4net.config文件属性可能如下图所示(生成操作为无,不复制到输出目录)

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


重新生成解决方案后,在生成目录中就能看到log4net.config文件
Step 2 上代码
思路:两个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();
}
.Net Core 实践 - 使用log4net记录日志(2)的更多相关文章
- .Net Core 实践 - 使用log4net记录日志(3)— log4net向ElasticSearch写日志
demo地址:https://github.com/PuzzledAlien/log4net_demo/tree/master/DotNetCoreConsole_V3 Windows 10 安装部署 ...
- .Net Core 实践 - 使用log4net记录日志(1)
demo地址:https://github.com/PuzzledAlien/log4net_demo 准备 log4net 最新版本是2.0.8 VS2017 .Net Core 2.2 测试电脑配 ...
- ASP.NET Core使用log4net记录日志
.NET常用的日志组件有NLog.Log4net等,.NET CORE下微软也自带了日志组件,到目前为止还没用过,而我本人常用的是log4net,下面简单讲讲.NET CORE下怎么使用log4net ...
- .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现
前言 上篇<.net core实践系列之短信服务-架构设计>介绍了我对短信服务的架构设计,同时针对场景解析了我的设计理念.本篇继续讲解Api服务的实现过程. 源码地址:https://gi ...
- Windows服务使用log4net记录日志
该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 比较流行的日志组件有以下四种,Topshelf都有相应的组件提供 log4net NL ...
- [转]C#使用Log4Net记录日志
第一步:下载Log4Net 下载地址:http://logging.apache.org/log4net/download_log4net.cgi 把下载的 log4net-1.2.11-bin-n ...
- .net core实践系列之SSO-跨域实现
前言 接着上篇的<.net core实践系列之SSO-同域实现>,这次来聊聊SSO跨域的实现方式.这次虽说是.net core实践,但是核心点使用jquery居多. 建议看这篇文章的朋友可 ...
- .net core实践系列之短信服务-目录
前言 经过两周多的业余时间,终于把该系列的文章写完了.第一次写系列,可能部分关键点并没有覆盖到,如果有疑问的朋友可以随时反馈给我.另外也感谢在我发布文章时给予我方案建议与反馈源码BUG的朋友们.下面是 ...
- .net core实践系列之短信服务-架构设计
前言 上篇<.net core实践系列之短信服务-为什么选择.net core(开篇)>简单的介绍了(水了一篇).net core.这次针对短信服务的架构设计和技术栈的简析. 源码地址:h ...
随机推荐
- centos7.5安装python3.7
系统状态 CentOS Linux release 7.5.1804 (Core) mini版安装系统 Python-3.7.0.tgz 官方下载源码包 安装系统依赖包 # 编译必备 yum inst ...
- 873D. Merge Sort
Merge sort is a well-known sorting algorithm. The main function that sorts the elements of array a w ...
- Mybatis中的Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 找不到Mapper.xml文件的问题
1 首先在配置mapper-locations的时候: classpath: 只在现有目录下寻找配置文件 classpath*: 在现有的项目目录下和依赖的jar包下寻找xml配置文件
- js与jq基础记录
1.在js传递参数中含加号(+)的处理方式: 只需要把js中传过去的+号替换成base64 编码 %2B:encodeURI(str).replace(/\+/g,'%2B'). 2.随机产生8位随机 ...
- swust oj 1012
哈希表(链地址法处理冲突) 1000(ms) 10000(kb) 2542 / 6517 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法.建立链表的时候采用尾插法 ...
- RabbitMQ in Action (1): Understanding messaging
1. Consumers and producers Producers create messages and publish (send) them to a broker server (Rab ...
- 依赖注入[4]: 创建一个简易版的DI框架[上篇]
本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章(<控制反转>.<基于IoC的设计模式>和< 依赖注入模式>)从纯理论的角度 ...
- 操作系统中 heap 和 stack 的区别
操作系统中 heap 和 stack 的区别heap 和 stack是什么堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.==在单片机 ...
- 【RL-TCPnet网络教程】第5章 PHY芯片和STM32的MAC基础知识
第5章 PHY芯片和STM32的MAC基础知识 本章节为大家讲解STM32自带的MAC和PHY芯片的基础知识,为下一章底层驱动的讲解做一个铺垫. 5.1 初学者重要提示 5.2 ...
- 体验一把做黑客的感觉-IPC$入侵之远程控制
前言 一看你就是看标题进来的,我可不是标题党啊,大家往下看吧,本文章主要介绍了利用IPC共享漏洞上传并执行木马. 基础知识 一.什么是IPC 进程间通信(IPC,Inter-Process Commu ...