Log4J 如何分开Logger输出

阅读更多

今天和两个同事讨论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");
	}

}

 我希望bar可以输出到一个地方,其他的logger可以输出到一个地方。一般的配置文件如下:

 





  
    
      
    
  

    
    
    
    
    
      
    
  


  
     
     
  
  
  
    
    
  

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

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

 





  
    
      
    
  

    
    
    
    
    
      
    
  


  
     
     
  
  
  
    
    
  

 唯一的区别是在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

           
 

 

你可能感兴趣的:(log4j,logger)