使用Log组件时,我们通常自定义ILogger接口,使用Log4Net等组件进行适配来定义不同的实现类。使用Log4Net日志组件时,为了即方便单元测试又能使用配置文件,我们通过Log4Net的ILogger接口使用Log4Net,对Log4Net进行单元测试时我们可以通过使用MemoryAppender方式测试。

1.定义ILogger接口

ILogger可以通过使用日志级别的枚举类型精简方法数量,也可以不适用枚举直接定义多个方法。

public interface ILogger
{
void Debug(string format, params string[] args); void Error(string format, params string[] args); void Fatal(string format, params string[] args); void Info(string format, params string[] args); void Warn(string format, params string[] args);
}

2.创建使用Log4Net适配的实现类Log4NetAdapter

public class Log4NetAdapter : ILogger
{
private readonly ILog _rootLogger; public Log4NetAdapter(ILog rootLogger)
{
this._rootLogger = rootLogger;
} public void Debug(string format, params string[] args)
{
if (this._rootLogger.IsDebugEnabled)
{
_rootLogger.Debug(string.Format(format, args));
}
} public void Info(string format, params string[] args)
{
if (this._rootLogger.IsInfoEnabled)
{
_rootLogger.Info(string.Format(format, args));
}
} public void Warn(string format, params string[] args)
{
if (this._rootLogger.IsWarnEnabled)
{
_rootLogger.Warn(string.Format(format, args));
}
} public void Error(string format, params string[] args)
{
if (this._rootLogger.IsErrorEnabled)
{
_rootLogger.Error(string.Format(format, args));
}
} public void Fatal(string format, params string[] args)
{
if (this._rootLogger.IsFatalEnabled)
{
_rootLogger.Fatal(string.Format(format, args));
}
}
}

3.使用MemoryAppender进行单元测试

public class Log4netAdapterTest
{
private MemoryAppender _appender; [Fact]
public void Test()
{
_appender = new MemoryAppender
{
Name = "Unit Testing Appender",
Layout = new log4net.Layout.PatternLayout("%message")
};
_appender.ActivateOptions(); var root = ((Hierarchy)log4net.LogManager.GetRepository()).Root;
root.AddAppender(_appender);
root.Repository.Configured = true; ILogger logger = new Log4NetAdapter(log4net.LogManager.GetLogger("root"));
logger.Info("test {0}", "message");
Assert.Equal(_appender.GetEvents()[].MessageObject.ToString(), string.Format("test {0}", "message"));
}
}

4.创建Log4NetLoggerFactory

通常我们使用配置文件方式配置Log4Net,因此创建Log4NetLoggerFactory提供从配置文件中创建的ILog对象。

public class LoggerFactory
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(LoggerFactory)); static LoggerFactory()
{
log4net.Config.XmlConfigurator.Configure();
} public static ILogger GetLogger()
{
return new Log4NetAdapter(log);
}
}

参考的配置文件

<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections> <log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</root>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="App_Data/Logs/log.txt" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<preserveLogFileNameExtension value="true" />
<datePattern value="yyyyMMdd" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
</log4net>

运行结果:

4.通过依赖注入使用ILogger

在ASP.NET项目中使用时,通过DI容器进行注入。

protected void Application_Start()
{
//...
ObjectFactory.AddSingleton<ILogger, Log4NetAdapter>(LoggerFactory.GetLogger());
//...
}

ASP.NET 系列:单元测试之Log4Net的更多相关文章

  1. 补习系列(8)-springboot 单元测试之道

    目录 目标 一.About 单元测试 二.About Junit 三.SpringBoot-单元测试 项目依赖 测试样例 四.Mock测试 五.最后 目标 了解 单元测试的背景 了解如何 利用 spr ...

  2. ASP.NET Core搭建多层网站架构【3-xUnit单元测试之简单方法测试】

    2020/01/28, ASP.NET Core 3.1, VS2019, xUnit 2.4.0 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[3-xUnit单元测试 ...

  3. ASP.NET Core搭建多层网站架构【12-xUnit单元测试之集成测试】

    2020/02/01, ASP.NET Core 3.1, VS2019, xunit 2.4.1, Microsoft.AspNetCore.TestHost 3.1.1 摘要:基于ASP.NET ...

  4. ASP.NET 系列:单元测试

    单元测试可以有效的可以在编码.设计.调试到重构等多方面显著提升我们的工作效率和质量.github上可供参考和学习的各种开源项目众多,NopCommerce.Orchard等以及微软的asp.net m ...

  5. 使用VisualStudio进行单元测试之二

    借着工作忙的借口,偷了两天懒,今天继续单元测试之旅.前面说了如何进行一个最简单的单元测试,这次呢就跟大家一起来熟悉一下,在visual studio中如何进行数据驱动的单元测试. 开始之前先来明确一下 ...

  6. iOS 单元测试之XCTest详解(一)

    iOS 单元测试之XCTest详解(一) http://blog.csdn.net/hello_hwc/article/details/46671053 原创blog,转载请注明出处 blog.csd ...

  7. 玩转单元测试之Testing Spring MVC Controllers

    玩转单元测试之 Testing Spring MVC Controllers 转载注明出处:http://www.cnblogs.com/wade-xu/p/4311657.html The Spri ...

  8. 玩转单元测试之WireMock -- Web服务模拟器

    玩转单元测试之WireMock -- Web服务模拟器 WireMock 是一个灵活的库用于 Web 服务测试,和其他测试工具不同的是,WireMock 创建一个实际的 HTTP服务器来运行你的 We ...

  9. 单元测试之NSNull 检测

    本文主要讲 单元测试之NSNull 检测,在现实开发中,我们最烦的往往就是服务端返回的数据中隐藏着NSNull的数据,一般我们的做法是通过[data isKindOfClass:[NSNull cla ...

随机推荐

  1. 按要求编写Java应用程序。 (1)创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)、减速(车速自减)、修改车牌号,查询车的载重量。 编写两个构造方法:一个没有形参,在方法中将车牌号设置“XX1234”,速 度设置为100,载重量设置为100;另一个能为对象的所有属性赋值; (2)创建主类: 在主类中创建两个机动车对象。 创建第

    package com.hanqi.test; public class jidongche { private String chepaihao;//车牌号 private int speed;// ...

  2. JSON字符串和Dictionary字典类型的相互转换

    在开发过程中,往往会遇到数据类型转换的情况,根据自己的业务,可能转换类型有多种,下面就说一下json字符串和字典类型的转换. public static class JsonUntity { /// ...

  3. win7下硬盘安装ubuntu

    首先还是分区,在计算机上右键--管理--磁盘管理.装Ubuntu分配的硬盘大小最好是(20G以上)不要太小,这里请注意,Ubuntu和Windows文件系统完全不同,所以我们划好要给Ubuntu的分区 ...

  4. RedHat Linux 9.0的安装+入门指南(图文并茂)

    一,准备工作1,购买或下载Redhat9的安装光盘(3张盘)或镜像文件2,在硬盘中至少留2个分区给安装系统用,挂载点所用分区推荐4G以上,交换分区不用太大在250M左右比较适合,文件系统格式不论,反正 ...

  5. x01.os.16: 添加功能

    准备工作  1.确保是 win xp,如是 win 8,运行 nasm 需按提示同意安装组件.  2.确保 src 和 z_tools 在同一目录下,nasm 已包含在 z_tools 文件夹中.  ...

  6. HowTo: Linux Server Change OR Setup The Timezone

    Method 1 #tzselect # select timezone e.g. Asia/Shanghai#echo 'Asia/Shanghai' > /etc/timezone # se ...

  7. MMORPG大型游戏设计与开发(客户端架构 part7 of vegine)

    我在讲述某个东西的时候总喜欢从简单的入手,然后从互相关联的地方联合讲解,因为时间关系所以没能讲的十分详细,这点引以为憾,希望得到大家的谅解.这一节讲述的是微引擎(vengine)比较简单的一个模块,那 ...

  8. ASP.NET执行模型之IIS服务器处理流程

    之前在网上看过很多对这方面的讲解,但个人觉得看下来过于 "深奥",不容易理解,所以想用更简单的方式进行阐述,便于理解. 本次我们重点分析用户请求到页面呈现过程中Web服务器的处理过 ...

  9. hdu-5493 Queue(二分+树状数组)

    题目链接: Queue Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  10. AC日记——配对碱基链 openjudge 1.7 07

    07:配对碱基链 总时间限制:  1000ms 内存限制:  65536kB 描述 脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成.而构成DNA的碱基共有4种,分别为腺瞟呤(A).鸟嘌 ...