<logger>标签的作用:为不同的包使用不同的log配置。
如配置了
<logger name="com.runway" additivity="false">
<priority value ="info"/>
<appender-ref ref="activexAppender" />
</logger>
则com.runway包及其子包下的所有类使用的log配置都是info,且输出到activeXAppender.
其他类使用的log配置都是根logger
logger的默认配置具有继承特性, 即所有的logger配置继承根logger,
name为“a.b.c"的logger配置继承name为"a.b"的配置, name为"a.b"又继承name为"a"的logger而配置。。。
若使用了additivity="false"表示不继承父logger的配置。
将logger中的 additivity 属性配置为 false,则这个logger不会将日志流反馈到root中。
可以达到以logger中配置的appender方式来输出日志而其他地方输出的目的,看配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<
appender
name
=
"DEMO"
class
=
"com.XXXXX.RollingFileAppender"
>
<
param
name
=
"file"
value
=
"${loggingRoot}/xxx.log"
/>
<
param
name
=
"append"
value
=
"true"
/>
<
param
name
=
"encoding"
value
=
"GB2312"
/>
<
param
name
=
"threshold"
value
=
"info"
/>
<
param
name
=
"MaxFileSize"
value
=
"50MB"
/>
<
param
name
=
"MaxBackupIndex"
value
=
"10"
/>
<
layout
class
=
"org.apache.log4j.PatternLayout"
>
<
param
name
=
"ConversionPattern"
value
=
"%d [%X{requestURIWithQueryString}] %-5p %c{2} - %m%n"
/>
</
layout
>
</
appender
>
<
logger
name
=
"XXXX.XXXX.XXXX"
additivity
=
"false"
>
<
level
value
=
"${loggingLevel}"
/>
<
appender-ref
ref
=
"DEMO"
/>
</
logger
>
|
root的作用是收集下面所有反馈上来的信息流并根据配置在root中appender进行输出,只要你在looger中配置了additivity="false",就不会反馈到root中。
今天和两个同事讨论Log4j,他们都需要解决一个问题,怎么分开输出Logger。这么讲不清楚,举个例子:
- package com.gmail.at.ankyhe.log4jtest;
- import org.apache.log4j.Logger;
- public class ClassA {
- private static Logger logger = Logger.getLogger(ClassA.class.getName());
- public ClassA() {
- logger.info("ENTER ClassA()");
- }
- public void foo() {
- logger.info("foo()");
- bar();
- }
- public void bar() {
- Logger myLog = Logger.getLogger("bar");
- myLog.debug("bar()D");
- myLog.info("bar()I");
- }
- }
package com.gmail.at.ankyhe.log4jtest;
import org.apache.log4j.Logger;
public class ClassA {
private static Logger logger = Logger.getLogger(ClassA.class.getName());
public ClassA() {
logger.info("ENTER ClassA()");
}
public void foo() {
logger.info("foo()");
bar();
}
public void bar() {
Logger myLog = Logger.getLogger("bar");
myLog.debug("bar()D");
myLog.info("bar()I");
}
}
我希望bar可以输出到一个地方,其他的logger可以输出到一个地方。一般的配置文件如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
- <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >
- <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern"
- value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />
- </layout>
- </appender>
- <appender name="myFile" class="org.apache.log4j.RollingFileAppender">
- <param name="File" value="xml.log" />
- <param name="Append" value="false" />
- <param name="MaxBackupIndex" value="10" />
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
- </layout>
- </appender>
- <logger name="bar">
- <level value="info" />
- <appender-ref ref="myConsole" />
- </logger>
- <root>
- <priority value="debug" />
- <appender-ref ref="myFile" />
- </root>
- </log4j:configuration>
这样会发现一个问题,myLog的输出又会在文件,又会在终端。原因在Log4J官方的Introduction讲的很清楚:
http://logging.apache.org/log4j/1.2/manual.html 搜索Appender Additivity. 我解释一下就是默认情况下bar会集成root的输出。知道了原因,那怎么修改就简单了。
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
- <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >
- <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern"
- value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />
- </layout>
- </appender>
- <appender name="myFile" class="org.apache.log4j.RollingFileAppender">
- <param name="File" value="xml.log" />
- <param name="Append" value="false" />
- <param name="MaxBackupIndex" value="10" />
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
- </layout>
- </appender>
- <logger name="bar" additivity="false">
- <level value="info" />
- <appender-ref ref="myConsole" />
- </logger>
- <root>
- <priority value="debug" />
- <appender-ref ref="myFile" />
- </root>
- </log4j:configuration>
唯一的区别是在bar那个logger后面加了一个 additivity="false"。我试了一下,可以按照要求工作。这是xml的配置,一般的property的配置如下:
- log4j.rootLogger=DEBUG, FA
- log4j.category.bar = INFO, CA
- log4j.additivity.bar = false
- #Console Appender
- log4j.appender.CA=org.apache.log4j.ConsoleAppender
- log4j.appender.CA.layout=org.apache.log4j.PatternLayout
- log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
- #File Appender
- log4j.appender.FA=org.apache.log4j.FileAppender
- log4j.appender.FA.File=property.log
- log4j.appender.FA.layout=org.apache.log4j.PatternLayout
- log4j.appender.FA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n