您的位置:首页 > 其它

log4j.xml 基本配置

2015-10-26 21:49 323 查看

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:configurationxmlns:log4j='http://jakarta.apache.org/log4j/' >

<!--对于ConsoleAppender来说,在开发阶段还是比较有用的,能直接在ide中看到输出的日志内容,
但是在实际的产品阶段,我们更希望将日志输出到指定的文件上查看,这就需要用到FileAppender-->
<appendername="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<paramname="encoding" value="UTF-8" />
<layoutclass="org.apache.log4j.PatternLayout">
<paramname="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>

<!-- 写到远端日志 -->
<appendername="DEFAULT-APPENDER-REMOTE" class="org.apache.log4j.net.SyslogAppender">
<paramname="SyslogHost" value="${logServer}"/>
<paramname="Facility" value="LOCAL1"/>
<paramname="FacilityPrinting" value="true"/>
<layoutclass="org.apache.log4j.PatternLayout">
<paramname="ConversionPattern" value="%d %-5p %t %c %m%n" />
</layout>
</appender>

<appendername="FRAMEWORK-APPENDER-REMOTE" class="org.apache.log4j.net.SyslogAppender">
<paramname="SyslogHost" value="${logServer}"/>
<paramname="Facility" value="LOCAL3"/>
<paramname="FacilityPrinting" value="true"/>
<layoutclass="org.apache.log4j.PatternLayout">
<paramname="ConversionPattern" value="%d %-5p %t %c %m%n" />
</layout>
</appender>
<!-- 写到本地日志 -->
<!--第一步:配置appender-->
<appendername="INFO-LOCAL" class="org.apache.log4j.DailyRollingFileAppender">
<paramname="file" value="/opt/logs/info.log" />
<paramname="append" value="true" /><!--一般必须配置true,否则会覆盖而不是累加-->
<paramname="encoding" value="UTF-8" />
<layoutclass="org.apache.log4j.PatternLayout">
<paramname="ConversionPattern" value="%d %-5p %t %l %m%n" />
</layout>
<!--如果有过滤器,日志文件中就只会有符合过滤器的日志信息-->
<filterclass="org.apache.log4j.varia.LevelRangeFilter">
<paramname="levelMin" value="DEBUG" />
<paramname="levelMax" value="INFO" />
<paramname="AcceptOnMatch" value="true" />
</filter>
</appender>
<appendername="ERROR-LOCAL" class="org.apache.log4j.DailyRollingFileAppender">
<paramname="file" value="/opt/logs/error.log" />
<paramname="append" value="true" /><!--一般必须配置true,否则会覆盖而不是累加-->
<paramname="encoding" value="UTF-8" />
<layoutclass="org.apache.log4j.PatternLayout">
<paramname="ConversionPattern" value="%d %-5p %t %l %m%n" />
</layout>
<!--如果有过滤器,日志文件中就只会有符合过滤器的日志信息-->
<filterclass="org.apache.log4j.varia.LevelRangeFilter">
<paramname="levelMin" value="WARN" />
<paramname="levelMax" value="FATAL" />
<paramname="AcceptOnMatch" value="true" />
</filter>
</appender>

<!--第二步:配置logger。
如果不配置,系统会采用默认策略,即additivity="true",level value="DEBUG"。
注意:additivity=true,表示遵循缺省的继承机制,此时就不应该继续配置appender-ref,否则日志会出现重复
相反,如果additivity=false,就必须要配置appender-ref,否则日志不会被打印,配置也就没有意义-->
<loggername="com.test.log4j" additivity="true">
<!--给具体的logger配置日志级别,比如com.test包下面日志级别大于等于DEBUG的,
才会交给appender进行处理。
注意:对于com.test包而言,此处的级别会覆盖root下面的日志级别-->
<levelvalue="INFO" />
<!--如果此处配置了append-ref,而且additivity="true",将会和root里面的同一个
append-ref形成累加,即重复日志-->
<!--<appender-ref ref="CONSOLE" />-->
<!--<appender-ref ref="DEFAULT-LOCAL"/>-->
<!--<appender-ref ref="ERROR-LOCAL"/>-->
</logger>
<loggername="com.test2" additivity="false">
<levelvalue="INFO" />
<appender-refref="INFO-LOCAL" />
</logger>

<!--第三步:配置root-->
<!--root的作用是收集所有配置的logger反馈上来的信息流并根据配置在root中appender进行输出,
只要你在looger中配置了additivity="false",就不会反馈到root中。-->
<root>
<!--优先级小于具体的logger中配置的级别,只有当具体的logger没有配置的时候,
这里才会对具体的looger起作用-->
<levelvalue="DEBUG" />
<appender-refref="CONSOLE" />
<appender-refref="INFO-LOCAL" />
<appender-refref="ERROR-LOCAL"/>
</root>
</log4j:configuration>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: