• log4j.xml 基本配置


    log4j.xml 基本配置

    1      简介

           一般log4j的xml配置方式基本步骤有3个,第一步:配置appender;第二步:配置logger;第三步:配置root。下面配置一个ConsoleAppender和两个DailyRollingFileAppender为例具体展开。

    1.1  日志级别

           不考虑其他因素,日记级别FATAL>ERROR>WARN>INFO>DEBUG,这个是许多同学都清楚的,但是结合appender,logger,root的配置后,日志打印的结果会发生一些微妙的变化。

           首先,root的中的日志级别在用户没有为某一个具体的logger配置日志级别的时候才会对该logger生效。这里就可以用来解释有的同学问为什么在root中配置了ERROR级别,但是日志中依旧有INFO的日志输出。

           其次,如果某一个appender配置了日志过滤器,那使用该appender的logger配置日志级别的时候,范围不超出appender过滤的级别信息才会被输出。

    2      配置appender

           图2-1是一个标准的ConsoleAppender配置:

    图 2‑1

           如注释所描述,ConsoleAppender一般在我们调试项目时候用处比较大,这里不再多余描述。

           图2-2是一个标准的FileAppender配置,这里我配置了一个info.log文件和一个eror.log,位于/opt/logs目录下面,分别用来记录一般消息和错误消息。

                                                        

    图 2‑2

             appender的配置相对比较简单,除了过滤器,没有特殊要注意的。

    3   配置logger

           图3-1是两种looger配置。

    图 3‑1

             logger的name属性指代的是程序包路径,不用赘述。additivity属性,表示是否遵循缺省的继承机制。

             需要注意:

             1如果我们配置了true,那我们最好不要再给该logger配置appender-ref属性,除非被配置的appender-ref我们没有继续添加在root的appender-ref中,否则我们会发现日志重复。

             2如果我们配置了false,那就必须为该logger配置appender-ref,否则日志不会被打印。

    4   配置root

           图4-1是一个标准的root配置。

    图 4‑1

             

    root的作用是是收集所有配置的logger(additivity=true)反馈上来的信息流并且根据root中配置的appender-ref进行输出,所以,如果我们logger配置了additivity=true,又配置了appender-ref,会导致日志重复。

             注意:这里的level值对那些没有配置日志级别,而且additivity=true的logger才会有作用。

    下面是具体的配置信息:

    <?xml version="1.0" encoding="UTF-8"?>  
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >
    
       <!--对于ConsoleAppender来说,在开发阶段还是比较有用的,能直接在ide中看到输出的日志内容,
       但是在实际的产品阶段,我们更希望将日志输出到指定的文件上查看,这就需要用到FileAppender-->
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
          <param name="encoding" value="UTF-8" />
          <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="%d %-5p %t %l %m%n" />
          </layout>
          <!--如果有过滤器,当前appender只会处理满足过滤器条件的日志信息-->
          <!--<filter class="org.apache.log4j.varia.LevelRangeFilter">
             <param name="levelMin" value="DEBUG" />
             <param name="levelMax" value="FATAL" />
             <param name="AcceptOnMatch" value="true" />
          </filter>-->
    </appender>
    
       <!-- 写到远端日志 -->
    <appender name="DEFAULT-APPENDER-REMOTE" class="org.apache.log4j.net.SyslogAppender">
          <param name="SyslogHost" value="${logServer}"/> 
           <param name="Facility" value="LOCAL1"/>
              <param name="FacilityPrinting" value="true"/>
           <layout class="org.apache.log4j.PatternLayout">
               <param name="ConversionPattern" value="%d %-5p %t %c %m%n" />
           </layout> 
       </appender>
       
       <appender name="FRAMEWORK-APPENDER-REMOTE" class="org.apache.log4j.net.SyslogAppender">
          <param name="SyslogHost" value="${logServer}"/> 
           <param name="Facility" value="LOCAL3"/>
              <param name="FacilityPrinting" value="true"/>
           <layout class="org.apache.log4j.PatternLayout">
               <param name="ConversionPattern" value="%d %-5p %t %c %m%n" />
           </layout> 
       </appender>
       <!-- 写到本地日志 -->
       <!--第一步:配置appender-->
    <appender name="INFO-LOCAL" class="org.apache.log4j.DailyRollingFileAppender">
          <param name="file" value="/opt/logs/info.log" />
          <param name="append" value="true" /><!--一般必须配置true,否则会覆盖而不是累加-->
    <param name="encoding" value="UTF-8" />
          <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="%d %-5p %t %l %m%n" />
          </layout>
          <!--如果有过滤器,日志文件中就只会有符合过滤器的日志信息-->
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
             <param name="levelMin" value="DEBUG" />
             <param name="levelMax" value="INFO" />
             <param name="AcceptOnMatch" value="true" />
          </filter>
       </appender>
       <appender name="ERROR-LOCAL" class="org.apache.log4j.DailyRollingFileAppender">
          <param name="file" value="/opt/logs/error.log" />
          <param name="append" value="true" /><!--一般必须配置true,否则会覆盖而不是累加-->
    <param name="encoding" value="UTF-8" />
          <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="%d %-5p %t %l %m%n" />
          </layout>
          <!--如果有过滤器,日志文件中就只会有符合过滤器的日志信息-->
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
             <param name="levelMin" value="WARN" />
             <param name="levelMax" value="FATAL" />
             <param name="AcceptOnMatch" value="true" />
          </filter>
       </appender>
    
       <!--第二步:配置logger。
       如果不配置,系统会采用默认策略,即additivity="true",level value="DEBUG"。
       注意:additivity=true,表示遵循缺省的继承机制,此时就不应该继续配置appender-ref,否则日志会出现重复
       相反,如果additivity=false,就必须要配置appender-ref,否则日志不会被打印,配置也就没有意义-->
    <logger name="com.test.log4j" additivity="true">
          <!--给具体的logger配置日志级别,比如com.test包下面日志级别大于等于DEBUG的,
          才会交给appender进行处理。
          注意:对于com.test包而言,此处的级别会覆盖root下面的日志级别-->
    <level value="INFO" />
          <!--如果此处配置了append-ref,而且additivity="true",将会和root里面的同一个
          append-ref形成累加,即重复日志-->
          <!--<appender-ref ref="CONSOLE" />-->
          <!--<appender-ref ref="DEFAULT-LOCAL"/>-->
          <!--<appender-ref ref="ERROR-LOCAL"/>-->
    </logger>
       <logger name="com.test2" additivity="false">
          <level value="INFO" />
          <appender-ref ref="INFO-LOCAL" />
       </logger>
    
       <!--第三步:配置root-->
       <!--root的作用是收集所有配置的logger反馈上来的信息流并根据配置在root中appender进行输出,
       只要你在looger中配置了additivity="false",就不会反馈到root中。-->
    <root>
          <!--优先级小于具体的logger中配置的级别,只有当具体的logger没有配置的时候,
          这里才会对具体的looger起作用-->
    <level value="DEBUG" />
          <appender-ref ref="CONSOLE" />
          <appender-ref ref="INFO-LOCAL" />
          <appender-ref ref="ERROR-LOCAL"/>
       </root>
    </log4j:configuration>  
  • 相关阅读:
    BZOJ4644 经典傻逼题 (线段树分治+可撤销线性基+Xor)
    CF678E Another Sith Tournament(思维+dp)
    HDU 6511
    HDU6513 Reverse It(容斥+Cnk)
    一篇最浅显易懂的Splay讲解(试问谁能比我的更易懂
    [CTSC2016]时空旅行 (线段树分治+凸壳
    关于dsu on tree 和一些例题 CF 741 D
    关于区间开根号+区间询问
    [FJOI2015]火星商店问题 --线段树分治+可持久化trie
    线段树 关于pushup的技巧
  • 原文地址:https://www.cnblogs.com/yao5758/p/14101315.html
Copyright © 2020-2023  润新知