log4j.xml 基本配置

时间:2022-10-28 21:56:07

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配置:

log4j.xml 基本配置

log4j.xml 基本配置

图 2‑1

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

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

      log4j.xml 基本配置                                              

图 2‑2

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

3   配置logger

       图3-1是两种looger配置。

log4j.xml 基本配置

log4j.xml 基本配置

图 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配置。

log4j.xml 基本配置

log4j.xml 基本配置

图 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>