关于log4j root logger 标签 以及additivity 属性

<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。这么讲不清楚,举个例子:

 

 

Java代码 复制代码  收藏代码
  1. package com.gmail.at.ankyhe.log4jtest;  
  2.   
  3. import org.apache.log4j.Logger;  
  4.   
  5. public class ClassA {  
  6.       
  7.     private static Logger logger = Logger.getLogger(ClassA.class.getName());  
  8.       
  9.     public ClassA() {  
  10.         logger.info("ENTER ClassA()");  
  11.     }  
  12.       
  13.     public void foo() {  
  14.         logger.info("foo()");  
  15.         bar();  
  16.     }  
  17.       
  18.     public void bar() {  
  19.         Logger myLog = Logger.getLogger("bar");  
  20.         myLog.debug("bar()D");  
  21.         myLog.info("bar()I");  
  22.     }  
  23.   
  24. }  
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代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
  3.   
  4. <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >  
  5.   
  6.   <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">  
  7.     <layout class="org.apache.log4j.PatternLayout">  
  8.       <param name="ConversionPattern"    
  9.         value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />  
  10.     </layout>  
  11.   </appender>  
  12.   
  13.   <appender name="myFile" class="org.apache.log4j.RollingFileAppender">    
  14.     <param name="File" value="xml.log" />  
  15.     <param name="Append" value="false" />  
  16.     <param name="MaxBackupIndex" value="10" />  
  17.     <layout class="org.apache.log4j.PatternLayout">  
  18.       <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />  
  19.     </layout>  
  20.   </appender>  
  21.   
  22.   
  23.   <logger name="bar">  
  24.     <level value="info" />   
  25.     <appender-ref ref="myConsole" />   
  26.   </logger>  
  27.     
  28.   <root>  
  29.     <priority value="debug" />  
  30.     <appender-ref ref="myFile" />  
  31.   </root>  
  32. </log4j:configuration>  

 这样会发现一个问题,myLog的输出又会在文件,又会在终端。原因在Log4J官方的Introduction讲的很清楚:

http://logging.apache.org/log4j/1.2/manual.html  搜索Appender Additivity. 我解释一下就是默认情况下bar会集成root的输出。知道了原因,那怎么修改就简单了。

 

Xml代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
  3.   
  4. <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >  
  5.   
  6.   <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">  
  7.     <layout class="org.apache.log4j.PatternLayout">  
  8.       <param name="ConversionPattern"    
  9.         value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />  
  10.     </layout>  
  11.   </appender>  
  12.   
  13.   <appender name="myFile" class="org.apache.log4j.RollingFileAppender">    
  14.     <param name="File" value="xml.log" />  
  15.     <param name="Append" value="false" />  
  16.     <param name="MaxBackupIndex" value="10" />  
  17.     <layout class="org.apache.log4j.PatternLayout">  
  18.       <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />  
  19.     </layout>  
  20.   </appender>  
  21.   
  22.   
  23.   <logger name="bar" additivity="false">  
  24.     <level value="info" />   
  25.     <appender-ref ref="myConsole" />   
  26.   </logger>  
  27.     
  28.   <root>  
  29.     <priority value="debug" />  
  30.     <appender-ref ref="myFile" />  
  31.   </root>  
  32. </log4j:configuration>  

 唯一的区别是在bar那个logger后面加了一个 additivity="false"。我试了一下,可以按照要求工作。这是xml的配置,一般的property的配置如下:

 

Xml代码 复制代码  收藏代码
  1. log4j.rootLogger=DEBUG, FA  
  2. log4j.category.bar = INFO, CA  
  3. log4j.additivity.bar = false  
  4.   
  5. #Console Appender  
  6.   
  7. log4j.appender.CA=org.apache.log4j.ConsoleAppender  
  8. log4j.appender.CA.layout=org.apache.log4j.PatternLayout  
  9. log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n  
  10.   
  11. #File Appender  
  12. log4j.appender.FA=org.apache.log4j.FileAppender  
  13. log4j.appender.FA.File=property.log  
  14. log4j.appender.FA.layout=org.apache.log4j.PatternLayout  
  15. log4j.appender.FA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n  
  16.   
  17.              
 

 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值