在DLL中提供多个Log4net实例

应用场景:

控制软件工程拆分为多个子项目,在开发阶段希望每个子项目的日志是单独的。同时又希望日志统一集中定义在Tools(Tools为工具类项目,生成Tools.dll)下,而不是分散在各个子项目中。这就需要解决以下几个问题:

如何在DLL方案中配置Log4net;如何分类Logger;如何在外部使用Logger。

 

  1.在DLL中使用App.config配置Log4net

    • 使用NuGet添加log4net引用。
    • 为此项目添加应用程序配置文件 Tools.config。
    • 在Assembled中监视此配置文件。
    • 在Tools.config的文件属性中选择"如果较新则复制"。

 

2.在Log4net中配置多个名称的Logger对象
    • 在Tools.config中添加日志配置。其中 <root>定义了日志的记录级别,当前为全记录。<logger/>会继承<root/>的属性。
    • 配置不同的日志输出目标。在配置文件中表现为<appender/>的定义。
    • 关联<logger/>与<appender/>。同时指定<logger>的name属性,获取不同日志对象时使用。

 

<configSections>

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

</configSections>

<log4net name="DefaultLogger">

<root>

<level value="ALL" />

</root>

 

<logger name="Doraemon.Default">

<appender-ref ref="DefaultLogger"/>

</logger>

 

<logger name="Doraemon.Hardware">

<appender-ref ref="HardwareLogger"/>

</logger>

 

 

<!-- 统一的无类别日志 -->

<appender name="DefaultLogger" type="log4net.Appender.RollingFileAppender">

<file value="log/default.log" />

<appendToFile value="true" />

<rollingStyle value="Size" />

<maxSizeRollBackups value="20" />

<maximumFileSize value="256KB" />

<staticLogFileName value="true" />

<layout type="log4net.Layout.PatternLayout">

<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />

</layout>

</appender>

 

<!--硬件日志-->

<appender name="HardwareLogger" type="log4net.Appender.RollingFileAppender">

<file value="log/hardware.log" />

<appendToFile value="true" />

<rollingStyle value="Size" />

<maxSizeRollBackups value="20" />

<maximumFileSize value="256KB" />

<staticLogFileName value="true" />

<layout type="log4net.Layout.PatternLayout">

<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />

</layout>

</appender>

 

 

 

3.在其他项目中使用

 

 

public static class Logger

{

public static ILog DefaultLogger { get; }

public static ILog HardwareLogger { get; }

static Logger()

{

DefaultLogger = LogManager.GetLogger(@"Doraemon.Default");

HardwareLogger = LogManager.GetLogger("Doraemon.Hardware");

}

}

 

4.单元测试

    [TestMethod]

public void LoggerTest()

{

var loggerCollect = new List<ILog>()

{

DefaultLogger,

HardwareLogger,

};

var select = loggerCollect.FindAll(

(p) =>

p.IsDebugEnabled == p.IsErrorEnabled == p.IsFatalEnabled == p.IsInfoEnabled == p.IsWarnEnabled

);

Assert.AreEqual(loggerCollect.Count, select.Count, "日志对象初始化存在问题");

}

 

5.参考

 

    1. ConfigManager.Net - App.config and Web.config helper utility, http://www.codeproject.com/Articles/26544/ConfigManager-Net-App-config-and-Web-config-helper
    2. Log4net, http://logging.apache.org/log4net/download_log4net.cgi

你可能感兴趣的:(在DLL中提供多个Log4net实例)