• Log4Net的基本使用


    1、首先在项目中引用log4net.dll(可从网上下载)


    2、在项目中的Properties文件夹下的AssemblyInfo.cs中加入代码:

    WINFORM应用程序

    using log4net.Config; 
    
    ...
    [assembly: log4net.Config.XmlConfigurator()]
    //或 [assembly:log4net.Config.DOMConfigurator()]

    WEBFORM程序

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

     3、在Web.Config或App.Config里配置Log4Net

        首先,在<configuration>下添加入以下配置节(必须是第一个子节点,否则报错)

     <!--log4net -->
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler" />
      </configSections>

      然后,加入log4net配置内容的定义,范例如下:

      <log4net>
        <root>
          <level value="ALL" /> <!--level定义记录的日志级别,级别由高往低依次是:None Fatal ERROR WARN DEBUG INFO ALL-->
          <appender-ref ref="rollingFile" />
        </root>
    
        <logger name="Log4NetTest.LogTest"> <!--logger是负责日志的记录者-->
          <level value="DEBUG" />
          <appender-ref  ref="rollingFile" /> <!--ref:参照引用-->
          <appender-ref ref="consoleApp" /> 
        </logger>
        
        <appender  name="rollingFile" type="log4net.Appender.RollingFileAppender" ><!--appender提供记录的介质-->
          <param name="File"  value="Logs\ApplePush" /><!--日志路径-->
          <param name="AppendToFile" value="true"/><!--日志生成追加在文件中-->
          <param name="DatePattern" value=".yyyyMMdd&quot;.log&quot;" /> <!--生成日志文件名称的格式-->
          <param name="RollingStyle" value="Date"/> <!--日志重复方式,按照日期重复,每天产生一个日志文件-->
          <param name="StaticLogFileName" value="false"/>
          
          <layout type="log4net.Layout.PatternLayout" ><!--layout负责把记入的内容格式化-->
            <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
            <param name="Header" value="&#13;&#10;----------------------header 程序启动--------------------------&#13;&#10;" />
            <param name="Footer" value="&#13;&#10;----------------------footer 程序正常退出--------------------------&#13;&#10;" />
          </layout>
        </appender>
        
        <appender name="consoleApp" type="log4net.Appender.ConsoleAppender"    >
          <layout type="log4net.Layout.PatternLayout"   > 
            <param  name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
          </layout>
        </appender>
        
      </log4net>

    下面对上述代码稍做讲解:

    <log4net>是log4net配置节的根标记。

    <root>标记定义一个根级别的记录者,log4net的记录者采用层级组织的, 两个logger,A的名字叫loggerA,B的名字叫loggerA.B的话,那么B就是A的儿子,B会自动继承A的一些定义,例如LEVEL定义,appender-ref定义等,root就是总的logger,其余定义的logger都是他的后代,都会继承他的设置,包括ROOT在内的每一个LOGGER(ROOT也是一个LOGGER,只不过,他是祖先而已,别的方面,跟其他LOGGER一样),都可以定义Level

    <level>定义记录的日志级别,级别由高往低依次是: None Fatal ERROR WARN DEBUG INFO ALL

    级别的定义要注意,如果你定义DEBUG,那么低于DEBUG级别以下的信息,将不会记入日志,啥意思呢?就是说,就算你在程序里,用log.info()来写入一个日志信息,可是你在配置中指定level为DEBUG,由于INFO级别低于DEBUG,所以,不会被记入日志.这样的处理非常灵活

    <appender-ref>了,ref是参照的意思

    log4net的架构的四个要素: <logger>   <appender>  < layout>   <filter>

      <logger>是负责日志的记录者  

      <appender>提供记录的介质  

      <layout>负责把记入的内容格式化

      <filter>负责把内容进行筛选

    可以说,整个过程就是一个日志流水线,每个成员负责其中的一个环节 logger发出记录信息,appender接到信息,根据内部的layout配置对记录信息格式化,根据filter决定此信息是否被过滤掉,最后,将其序列化

    因此,logger的appender-ref就是定义说,LOGGER要找谁去将内容写入磁盘,流或其他介质,因此,十分重要吧 既然是ref引用,那肯定要定义这个被引用的appender对象了呀

    每个appender都代表了一个输出介质 name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质 log4net支持的appender类型有十几种,最常用的有rollingFileAppender,AdoNetAppender,EventLogAppender,FileAppender,分别把日志记入文件,系统日志和数据库 除此之外,appender内的其他参数都用param标记,以key/value形式定义于其内

    这里有个小提示,每一个appender,log4net并没有在文档中提出他们需要哪些参数,那么,我们怎么知道呢?

    原来,这些param的名称,你可以直接查对应的appender类的属性名即可,例如,使用EventLogAppender时,通过查看类的属性,我们知道其有 LogName,ApplicationName属性,那么,意味着,你可以直接在这个APPENDER的param里加入以下内容: <param name="LogName" value="Application" /> <param name="ApplicationName" value="log4netTest" />

    定义了appender的NAME及TYPE属性,以及使用param为其指定参数后,一个appender就建立了,你可以使用他的名字在LOGGER的<appender-ref中去 引用它,那么,引用它的LOGGER在写入日志时,就是写到了APPENDER中定义的介质中去了 一个LOGGER可以引用多个APPENDER,其结果是,同一个日志,被同时记录到多个介质中去 ,便如,同时发邮件,写入系统日志,发送到远程主机.不过,虽然可以这样做,但是还是要小心,因为,会对性能有一定的影响,除非你需要,否则,不要乱用此功能

    另外,appender中可以定义可选的layout,layout的定义非常有必要,如果你不想将来看到你的日志会感觉头晕的话,虽然log4net帮你写入日志,但是,日志信息的格式却是我们使用者自行定义的 layout的type参数指定使用哪个类的定义来格式化,常用的有XmlLayout,SimpleLayout,PatternLayout,这个当然要根据你的需要,以及你要产生的格式来选啦,如果你要输出成XML文档格式,你肯定不能用simplelayout吧 layout使用param以KEY/VALUE形式定义其参数 各个Layout类使用的参数当然不一样啦,具体的,你可以去看各个Layout类的属性 其中,PatternLayout可以使用ConversionPattern参数来指定一个格式化字符串 以及可以指定一个Header参数,做为日志开头的字符串,Footer来指定结尾字符串 这里有一个小技巧,日志中开头和结尾总想产生回车符吧,虽然logger在写入一条日志会自动回车,可是Header和FOOTER却不会,咋办?用 吗?(我从别人的BLOG上看到过)经实践, 会原样定改日志,根本不会转换.其实,我们可以用XML实体呀,使用&#13;&#10;就可以在指定位置插入一个回车换行符了

    最后,像log4net的文档中说的那样,如果你不想你的日志文件变得很大,使读写的性能下降的话,建议你还是分级管理日志,把粒度变小点,也就是说,除了定义ROOT外,最后,对每一个模块或每一个实体,依据用途,目的,定义各自的LOGGER配置,这样的好处是日志被分散了,日志文件增长就没那么快了.每一个LOGGER的结构跟ROOT是一模一样的,这里不再叙述了.像前面说的那样,如果你相让日志产生层级关系,你可以跟他们的NAME属性像C#中的namespace那样命名就可以了 要说明的是,LOGGER的定义是非必须的,只是一种建议罢了,Log4net的配置中,除了必须定义一个ROOT和一个APPENDER外,其他的都是可选的

    另一种配置log4net的方法,是在单独的XML文件中配置,这个时候,只要把log4net标记中的内容复制过来就行了,不需要configSections

    4、在应用程序中实用log4net日志

    using log4net;
    ...
    private static readonly ILog logger = LogManager.GetLogger("Log4NetTest.LogTest");//名称与配置文件中的名称一致
    ...
                 logger.Info("记录日志");
                 logger.InfoFormat("推送服务启动.....");
                 logger.Warn("警告信息");
                 logger.Error("错误信息");        
    静守己心,看淡浮华
  • 相关阅读:
    浏览器缓存机制
    vim 同时操作多行
    webpack打包性能优化
    测试 IE 浏览器兼容性 VirtualBox + modern.ie
    react-redux 学习笔记
    Redux 学习笔记
    Mac 下抓包工具 Charles 修改特定请求
    PyUsb的使用记录--window中
    Java 通过Jna调用dll路径问题
    OpenJdk14精简jdk运行javaFx样式丢失问题
  • 原文地址:https://www.cnblogs.com/jianglingli83/p/3601940.html
Copyright © 2020-2023  润新知