应用场景:

控制软件工程拆分为多个子项目,在开发阶段希望每个子项目的日志是单独的。同时又希望日志统一集中定义在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属性,获取不同日志对象时使用。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net name="DefaultLogger">
<root>
<level value="ALL"/>
</root> <logger name="Doraemon.Hardware">
<appender-ref ref="HardwareLogger"/>
</logger> <logger name="Doraemon.UI">
<appender-ref ref="UILogger"/>
</logger> <!--硬件日志-->
<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> <!--UI & Workflow日志-->
<appender name="UILogger" type="log4net.Appender.RollingFileAppender">
<file value="log/ui.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>
</log4net>
</configuration>
 
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.参考
ConfigManager.Net - App.config and Web.config helper utility, http://www.codeproject.com/Articles/26544/ConfigManager-Net-App-config-and-Web-config-helper
Log4net, http://logging.apache.org/log4net/download_log4net.cgi

2016-05-03 更新:

  如果不想将Log4net的配置文件集成在工程.config中,可以将它以XML格式存在在外部文件中。这样做的好处是随时可以自定义格式、自定义目标。配置到外部XML文件并没有什么不同,与配置在.config中及其相似,以下文件存储为log.config.xml.

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<logger name="Doraemon.Console">
<appender-ref ref="Console"/>
</logger> <logger name="Doraemon.UI">
<appender-ref ref="RollingFile"/>
</logger> <appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
</layout>
</appender> <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="example.log" />
<appendToFile value="true" />
<maximumFileSize value="100KB" />
<maxSizeRollBackups value="2" /> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level %thread %logger - %message%newline" />
</layout>
</appender> <root>
<level value="ALL" />
</root>
</log4net>

在代码中访问也没有什么不同:)

    class Program
{
private static readonly ILog log = LogManager.GetLogger(@"Doraemon.Console");//@"Doraemon.UI"); begins by importing log4net related classes. 
      
static void Main(string[] args)
{
// Set up a simple configuration that logs on the console.
XmlConfigurator.Configure(new System.IO.FileInfo(@"log.config.xml")); //使用正确的配置读取类别
log.Info("Entering application.");
var i = ;
while (i++ < )
log.Info($"i = {i}");
log.Debug("Exiting application."); Console.ReadLine();
}
}

2016-12-15 更新: 格式串

%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息

%n(new line):换行

%d(datetime):输出当前语句运行的时刻

%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数

%t(thread id):当前语句所在的线程ID

%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等

%c(class):当前日志对象的名称,例如:

%L:输出语句所在的行号

%F:输出语句所在的文件名

%-数字:表示该项的最小长度,如果不够,则用空格填充

配置多个Log4net实例的更多相关文章

  1. 动态创建 Log4net 实例

    动态创建log4net 实例 根据业务类型,动态的创建日志实例,将日志写到不同目录.常见的配置文件中统一配置,不能满足需求. 引用log4net nuget安装命令: Install-Package ...

  2. ORACLE配置tnsnames.ora文件实例

    ORACLE配置tnsnames.ora文件实例客户机为了和服务器连接,必须先和服务器上的监听进程联络.ORACLE通过tnsnames.ora文件中的连接描述符来说明连接信息.一般tnsnames. ...

  3. log4j.properties配置详解与实例

    log4j.properties配置详解与实例 第一步:加入log4j-1.x.x.jar到lib下. 第二步:在工程的src下下建立log4j.properties.内容如下: #OFF,syste ...

  4. centos 安装oracle 11g r2(二)-----监听配置与创建数据库实例

    centos 安装oracle 11g r2(二)-----监听配置与创建数据库实例 一.监听配置(命令:netca) 1.以 oracle 用户输入命令,启动图形化工具配置监听 [oracle@lo ...

  5. nbu8.1配置群集SQL Server实例的备份

    1.About SQL Server high availability (HA) environments SQL Server Intelligent policies support the f ...

  6. nacos配置本地多个实例(伪集群)

    在本地配置多个nacos实例(伪集群),一般就是配置多个nacos端口,并启动多个startup.sh脚本.网上一些博客通过修改startup.sh脚本来指定不同nacos端口,比如:./startu ...

  7. log4net配置和获取ILog实例

    名称 描述 File 文件路径,如果RollingStyle为Composite或Date,则这里设置为目录,文件名在DatePattern里设置,其他则这里要有文件名.已经扩展支持虚拟目录 Roll ...

  8. PLSQL配置新的oracle实例

    在Win环境下的Oracle中,D:\Oracle\product\10.1.0\db_1\NETWORK\ADMIN\tnsnames.ora文件很重要,它作用是:本地命名的配置.本地名可以用简单的 ...

  9. MySQL多配置方式的多实例的部署

    安装MySQL需要注意的事项: 选择MySQL的版本的建议: 1)稳定版:选择开源的社区版的稳定版GA版本 2)选择MySQL数据库GA版本发布后六个月以后得GA版本 3)选择发布版本前后几个月没有大 ...

随机推荐

  1. 全世界最短IE判定if(!+[1,])的解释(转)

    全世界最短IE判定if(!+[1,])的解释   虽然从司徒先生的博客上看到 全世界最短的IE判定 很长时间了,却一直对于原理没怎么去细看,今天同事(也是一后台程序员,并非前端)又问到这个问题,于是我 ...

  2. 批处理脚本命令行方式关闭Windows服务

    对于一些不常用的Windows Services,可以通过设置其启动类型为"禁用"而将其关闭.这种关闭方式是长期性的,电脑重启之后仍然起作用. 有时候希望在批处理脚本里通过命令行方 ...

  3. JDK - Tomcat - Eclipse - JSP - Servlet 配置运行全攻略

    花了将近两个月的时间,从 JDK 开始一步一步摸索,历经千辛万苦,终于让第一个 Servlet 运行起来了,创建第一个 Servlet  程序确实要比创建第一个 Asp.net 程序困难多了,但是不要 ...

  4. 【JavaScript】关于prototype原型的一些链接

    http://www.cnblogs.com/slowsoul/archive/2013/05/30/3107198.html http://www.thinksaas.cn/group/topic/ ...

  5. dsPIC33EP ADC模块初始化及应用实例

    //文件名 p33adc.h #ifndef _P33ADC_H_ #define _P33ADC_H_ //#include "p33adc.h" //--AD1CON1 #de ...

  6. [每日一题] OCP1z0-047 :2013-08-26 TIMESTAMP WITH LOCAL TIME ZONE....................112

    正确答案:C 使用TIMESTAMP WITH LOCAL TIME ZONE数据类型,用户插入数据时,oracle将会把用户的数据结合用户session的时区信息自动换算成数据库设定的时区的时间进行 ...

  7. SQL Server如何截断(Truncate)和收缩(Shrink)事务日志

    当SQL Server截断事务日志时,它仅仅是在虚拟日志文件中做个标记,以便不再使用它,然后准备以重用形式来做备份(假如运载在完整或是批量日志恢复模型).也就是说,在使用简单恢复模型时,事务日志包括如 ...

  8. SQL SERVER中查找某关键词位于哪些存储过程或函数

    USE [MYDB] go SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE routine_type='PROCEDURE' AND routine_d ...

  9. oc-21-class对象

    /** 什么是类对象(Class对象)? 类在内存当中也是以对象形式进行存储的. 1.类对象的类型:Class类型 2.如何创建类对象: 1)Class 类对象名 = [类名 class]; 2)类名 ...

  10. THD 变量存入threads中

    http://blog.csdn.net/gapaul/article/details/12047497 http://ourmysql.com/archives/930