实现目标:将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)的更多相关文章

  1. .Net Core 实践 - 使用log4net记录日志(3)— log4net向ElasticSearch写日志

    demo地址:https://github.com/PuzzledAlien/log4net_demo/tree/master/DotNetCoreConsole_V3 Windows 10 安装部署 ...

  2. .Net Core 实践 - 使用log4net记录日志(1)

    demo地址:https://github.com/PuzzledAlien/log4net_demo 准备 log4net 最新版本是2.0.8 VS2017 .Net Core 2.2 测试电脑配 ...

  3. ASP.NET Core使用log4net记录日志

    .NET常用的日志组件有NLog.Log4net等,.NET CORE下微软也自带了日志组件,到目前为止还没用过,而我本人常用的是log4net,下面简单讲讲.NET CORE下怎么使用log4net ...

  4. .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现

    前言 上篇<.net core实践系列之短信服务-架构设计>介绍了我对短信服务的架构设计,同时针对场景解析了我的设计理念.本篇继续讲解Api服务的实现过程. 源码地址:https://gi ...

  5. Windows服务使用log4net记录日志

    该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 比较流行的日志组件有以下四种,Topshelf都有相应的组件提供 log4net NL ...

  6. [转]C#使用Log4Net记录日志

    第一步:下载Log4Net 下载地址:http://logging.apache.org/log4net/download_log4net.cgi 把下载的  log4net-1.2.11-bin-n ...

  7. .net core实践系列之SSO-跨域实现

    前言 接着上篇的<.net core实践系列之SSO-同域实现>,这次来聊聊SSO跨域的实现方式.这次虽说是.net core实践,但是核心点使用jquery居多. 建议看这篇文章的朋友可 ...

  8. .net core实践系列之短信服务-目录

    前言 经过两周多的业余时间,终于把该系列的文章写完了.第一次写系列,可能部分关键点并没有覆盖到,如果有疑问的朋友可以随时反馈给我.另外也感谢在我发布文章时给予我方案建议与反馈源码BUG的朋友们.下面是 ...

  9. .net core实践系列之短信服务-架构设计

    前言 上篇<.net core实践系列之短信服务-为什么选择.net core(开篇)>简单的介绍了(水了一篇).net core.这次针对短信服务的架构设计和技术栈的简析. 源码地址:h ...

随机推荐

  1. 在浏览器输入URL时发生了什么

    浏览器器检查cache,如果请求对象已经缓存并且是最新的,执行第9步. 浏览器询问操作系统,请求服务器的IP地址 操作系统进行DNS查找,然后告诉浏览器服务器的IP 浏览器和服务器简历一个TCP连接( ...

  2. javaWeb+servlet+mysql实现简单的企业员工管理系统

    企业员工信息管理系统 一.源码描述       本程序为企业员工信息管理系统.是javaEE一个系统,主要实现登录功能和两个模块信息的增删改查.可以作为JAVAweb学习,也可在原有基础上进行深一步的 ...

  3. java枚举使用 总结

    补充几点: 1.枚举对象是可以用 == 比较. 2. TestEnum3反编译结果: F:\tree\Test\src\test>javap TestEnum3* Compiled from & ...

  4. Ubunto使用 码云 创建项目

    1.安装 git sudo apt-get install git配置 git 文件 git config --global user.name "你的用户名" git confi ...

  5. FCC(ES6写法) Make a Person

    用下面给定的方法构造一个对象. 方法有 getFirstName(), getLastName(), getFullName(), setFirstName(first), setLastName(l ...

  6. 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  7. [Swift]LeetCode367. 有效的完全平方数 | Valid Perfect Square

    Given a positive integer num, write a function which returns True if num is a perfect square else Fa ...

  8. php 168任意代码执行漏洞之php的Complex (curly) syntax

    今天了解了php 168的任意代码执行漏洞,Poc: http://192.168.6.128/pentest/cms/php168/member/post.php?only=1&showHt ...

  9. Java面试题中的Redis大合集,所有你想找的都在这里!

    概述 Redis 是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用.``` Redis 支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hyperl ...

  10. vue框架中的Axios封装

      function axios(options) {     let promise = new Promise((resolve, reject) => {         var xhr ...