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>