zoukankan      html  css  js  c++  java
  • Log4Net不同日志类型写入到不同文件

    1. 一直在用log4net,从来没有自己整理过。实践出真知,只有自己整理过才能真正掌握。

    2. log4net,应该读logfornet,以前一直说log4,log4............ 

    安装

    NuGet:

    AssemblyInfo.cs :

    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

    配置 

    log4net.config

    <log4net>
    
      <root>
        <level value="DEBUG" />
        <appender-ref ref="DebugRollingFileAppender" />
        <appender-ref ref="InfoRollingFileAppender" />
        <appender-ref ref="WarnRollingFileAppender" />
        <appender-ref ref="ErrorRollingFileAppender" />
      </root>
      
      <appender name="DebugRollingFileAppender" type="log4net.Appender.RollingFileAppender" >
        <file value="Logs/Debug/" />
        <appendToFile value="true" />
        <immediateFlush value="true" />
        <staticLogFileName value="false" />
        <rollingStyle value="Date" />
        <datePattern value="yyyy-MM-dd\yyyy-MM-dd_HH&quot;.log&quot;" />
        <MaximumFileSize value="50MB"/>
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%d{yyyy-MM-dd HH:mm:ss.ffff} [%t] %c :%newline %m%n %newline " />
          </layout>
        <filter type="log4net.Filter.LevelMatchFilter">
          <levelToMatch  value="DEBUG" />
        </filter>
        <filter type="log4net.Filter.DenyAllFilter" />
      </appender>
    
      <appender name="InfoRollingFileAppender" type="log4net.Appender.RollingFileAppender" >
        <file value="Logs/Info/" />
        <appendToFile value="true" />
        <immediateFlush value="true" />
        <staticLogFileName value="false" />
        <rollingStyle value="Date" />
        <datePattern value="yyyy-MM-dd\yyyy-MM-dd_HH&quot;.log&quot;" />
        <MaximumFileSize value="50MB"/>
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%d{yyyy-MM-dd HH:mm:ss.ffff} %p{NDC}:%newline %m%n" />
        </layout>
        <filter type="log4net.Filter.LevelMatchFilter">
          <levelToMatch  value="INFO" />
        </filter>
        <filter type="log4net.Filter.DenyAllFilter" />
      </appender>
    
      <appender name="WarnRollingFileAppender" type="log4net.Appender.RollingFileAppender" >
        <file value="Logs/Warn/" />
        <appendToFile value="true" />
        <immediateFlush value="true" />
        <staticLogFileName value="false" />
        <rollingStyle value="Date" />
        <datePattern value="yyyy-MM-dd\yyyy-MM-dd_HH&quot;.log&quot;" />
        <MaximumFileSize value="50MB"/>
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%d{yyyy-MM-dd HH:mm:ss.ffff} %p{NDC}:%newline %m%n" />
        </layout>
        <filter type="log4net.Filter.LevelMatchFilter">
          <levelToMatch  value="WARN" />
        </filter>
        <filter type="log4net.Filter.DenyAllFilter" />
      </appender>
    
      <appender name="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender" >
        <file value="Logs/Error/" />
        <appendToFile value="true" />
        <immediateFlush value="true" />
        <staticLogFileName value="false" />
        <rollingStyle value="Date" />
        <datePattern value="yyyy-MM-dd\yyyy-MM-dd_HH&quot;.log&quot;" />
        <MaximumFileSize value="50MB"/>
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%d{yyyy-MM-dd HH:mm:ss.ffff} %p{NDC}:%newline %m%n" />
        </layout>
        <filter type="log4net.Filter.LevelMatchFilter">
          <levelToMatch  value="ERROR" />
        </filter>
        <filter type="log4net.Filter.DenyAllFilter" />
      </appender>
        
    </log4net>

    客户端

            private ILog _log = log4net.LogManager.GetLogger("LogTestController");
            public ActionResult Index()
            {
                _log.Info("Info");
                _log.Error("Error");
                _log.Debug("Debug");
                _log.Warn("Warn");
    
                return View();
            }

    root 

    1.root元素没有属性,所有logger默认继承它,root是必须配置的。

    2.level元素:只有在这个级别或之上的事件才会被记录

    OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL 】

    3.appender-ref元素:指定一个或多个appender

    appender

    1.定义日志的输出方式,只能作为 log4net 的子元素。name属性必须唯一,type属性必须指定。

    【一般写文件日志用log4net.Appender.RollingFileAppender,可以根据日期格式或者文件大小来决定是否新建一个log.txt】

    2.file元素:指定日志路径。

    3.appendToFile元素:是否支持分割文件。

    4.rollingStyle元素:【Size:按日志大小,Date:日期格式分割】。

    5.datePattern元素:日期格式。

    6.MaximumFileSize元素:最小日志文件大小。

    7.layout元素:日志输出格式。【log4net.Layout.PatternLayout】。

    8.filter元素:指定级别的日志输出【LevelMatchFilter】

      或者指定一个范围级别的日志输出【LevelRangeFilter】

    PatterLayout的格式化字符串:

    Conversion Pattern NameEffect
    a 等价于appdomain
    appdomain 引发日志事件的应用程序域的友好名称。(我在使用中一般是可执行文件的名字。)
    c 等价于 logger
    C 等价于 type
    class 等价于 type
    d 等价于 date
    date

    发生日志事件的本地时间。 使用 DE<%utcdate 输出UTC时间。date后面还可以跟一个日期格式,用大括号括起来。DE<例如:%date{HH:mm:ss,fff}或者%date{dd MMM yyyy HH:mm:ss,fff}。如果date后面什么也不跟,将使用ISO8601 格式 。

    日期格式和.Net中DateTime类的ToString方法中使用的格式是一样。

    另外log4net还有3个自己的格式Formatter。 它们是 "ABSOLUTE", "DATE"和"ISO8601"分别代表 AbsoluteTimeDateFormatterDateTimeDateFormatterIso8601DateFormatter。例如: %date{ISO8601}%date{ABSOLUTE}

    它们的性能要好于ToString。

    exception

    异常信息

    日志事件中必须存了一个异常对象,如果日志事件不包含没有异常对象,将什么也不输出。异常输出完毕后会跟一个换行。一般会在输出异常前加一个换行,并将异常放在最后。

    F 等价于 file
    file

    发生日志请求的源代码文件的名字。

    警告:只在调试的时候有效。调用本地信息会影响性能。

    identity

    当前活动用户的名字(Principal.Identity.Name).

    警告:会影响性能。(我测试的时候%identity返回都是空的。)

    l 等价于 location
    L 等价于 line
    location

    引发日志事件的方法(包括命名空间和类名),以及所在的源文件和行号。

    警告:会影响性能。没有pdb文件的话,只有方法名,没有源文件名和行号。

    level

    日志事件等级

    line

    引发日志事件的行号

    警告:会影响性能。

    logger

    记录日志事件的Logger对象的名字。

    可以使用精度说明符控制Logger的名字的输出层级,默认输出全名。

    注意,精度符的控制是从右开始的。例如:logger 名为 "a.b.c", 输出模型为 %logger{2} ,将输出"b.c"。

    m 等价于 message
    M 等价于 method
    message

    由应用程序提供给日志事件的消息。

    mdc

    MDC (旧为:ThreadContext.Properties) 现在是事件属性的一部分。 保留它是为了兼容性,它等价于 property

    method

    发生日志请求的方法名(只有方法名而已)。

    警告:会影响性能。

    n 等价于 newline
    newline

    换行符

    ndc

    NDC (nested diagnostic context)

    p 等价于 level
    P 等价于 property
    properties 等价于 property
    property

    输出事件的特殊属性。例如: %property{user} 输出user属性。属性是由loggers或appenders添加到时间中的。 有一个默认的属性"DE<log4net:HostName"总是会有。DE<

    %property将输出所以的属性 。

    (我除了知道可以用它获得主机名外,还不知道怎么用。)

     
    r 等价于 timestamp
    t 等价于 thread
    timestamp

    从程序启动到事件发生所经过的毫秒数。

    thread

    引发日志事件的线程,如果没有线程名就使用线程号。

    type

    引发日志请求的类的全名。.

    可以使用精度控制符。例如: 类名是 "log4net.Layout.PatternLayout", 格式模型是 %type{1} 将输出"PatternLayout"。(也是从右开始的。)

    警告:会影响性能。

    u 等价于 identity
    username

    当前用户的WindowsIdentity。(类似:HostNameUsername)

    警告:会影响性能。

    utcdate

    发生日志事件的UTC时间。DE<后面还可以跟一个日期格式,用大括号括起来。DE<例如:%utcdate{HH:mm:ss,fff}或者%utcdate{dd MMM yyyy HH:mm:ss,fff}。如果utcdate后面什么也不跟,将使用ISO8601 格式 。

    日期格式和.Net中DateTime类的ToString方法中使用的格式是一样。

    另外log4net还有3个自己的格式Formatter。 它们是 "ABSOLUTE", "DATE"和"ISO8601"分别代表 AbsoluteTimeDateFormatterDateTimeDateFormatterIso8601DateFormatter。例如: %date{ISO8601}%date{ABSOLUTE}

    它们的性能要好于ToString。

    w 等价于 username
    x 等价于 ndc
    X 等价于 mdc
    %

    %%输出一个百分号

    参考文档:

    http://peibing211.blog.163.com/blog/static/37116360200992811595469/


    本文博客园地址:http://www.cnblogs.com/struggle999/p/7111436.html 
    如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Atitit 华为基本法 attilax读后感
    Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感
    Atitit 项目版本管理gitflow 与 Forking的对比与使用
    Atitit 管理的模式扁平化管理 金字塔 直线型管理 垂直管理 水平管理 矩阵式管理 网状式样管理 多头管理 双头管理
    Atitit 乌合之众读后感attilax总结 与读后感结构规范总结
    深入理解 JavaScript 异步系列(4)—— Generator
    深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
    深入理解 JavaScript 异步系列(2)—— jquery的解决方案
    深入理解 JavaScript 异步系列(1)——基础
    使用 github + jekyll 搭建个人博客
  • 原文地址:https://www.cnblogs.com/struggle999/p/7111436.html
Copyright © 2011-2022 走看看