2012-03-29 6 views
0

나는 다음과 같은 log4j.properties는 파일 한 :log4j가 stdout으로 출력되는 이유는 무엇입니까?

내 자바 프로그램에서
log4j.rootLogger=DEBUG,A1,A2,A3 

log4j.appender.A1=org.apache.log4j.RollingFileAppender 
log4j.appender.A1.Threshold=DEBUG 
log4j.appender.A1.File=log.out 
log4j.appender.A1.MaxFileSize=100KB 
log4j.appender.A1.MaxBackupIndex=1 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%p %d %t %c - %m%n 

log4j.appender.A2=org.apache.log4j.RollingFileAppender 
log4j.appender.A2.Threshold=WARN 
log4j.appender.A2.File=warnings.out 
log4j.appender.A2.MaxFileSize=100KB 
log4j.appender.A2.MaxBackupIndex=1 
log4j.appender.A2.layout=org.apache.log4j.PatternLayout 
log4j.appender.A2.layout.ConversionPattern=%p %d %t %c - %m%n 

log4j.appender.A3=org.apache.log4j.RollingFileAppender 
log4j.appender.A3.Threshold=ERROR 
log4j.appender.A3.File=errors.out 
log4j.appender.A3.MaxFileSize=100KB 
log4j.appender.A3.MaxBackupIndex=1 
log4j.appender.A3.layout=org.apache.log4j.PatternLayout 
log4j.appender.A3.layout.ConversionPattern=%p %d %t %c - %m%n 

, 나는 다음과 같은 변수가 정의 : 내가 로거 메소드를 호출 할 때

private Logger logger = Logger.getRootLogger(); 

static { 
    URL url = MyClass.class.getClassLoader().getResource("/log4j.properties"); 

    if (url == null) { 
     // log4j.properties not found in CLASSPATH, revert to console output 
     BasicConfigurator.configure(); 
    } 
    else { 
     // log4j.properties found 
     PropertyConfigurator.configure(url); 
    } 
} 

은 왜이다, 출력도 3 개의 출력 파일 외에도 콘솔 (stdout)으로 이동합니까?

+2

stderr이 아닌 stdout이 확실한가요? 후자는 설명하기가 더 쉬울 것입니다. – ruakh

+1

어떻게 log4j 파일을 패키지합니까? JVM을 시작할 때'-Dlog4j.configuration'을 올바른 파일로 설정 했습니까? – CoolBeans

+0

@ruakh 그것은 stderr로 갈 가능성이 있습니다 ... 콘솔로 갈 것이고 이유가 확실하지 않을 수도 있습니다 ... –

답변

1

log4j.properties 파일의 이름을 classpath의 루트에 넣으려면 기본적으로 선택되며 BasicConfigurator로 전달할 필요는 없습니다.

Java의 클래스 로더가 파일을 찾지 못하는 경우 (루트에서) 매개 변수없이 BasicConfigurator.configure()를 호출하면 log4j에서 기본 구성을 사용하게됩니다.

WEB-INF\classes\log4j.properties

0

: 즉, A는 당신의 전쟁 파일의 클래스 경로의 루트 있는지 log4j.properties를 확인 나는 전체 정적 블록을 제거하여 문제를 해결할 수 있었다. 다른 이상한 이유로 BasicConfigurator.configure()가 호출 된 것 같습니다. (다른 세 파일도 생성 되더라도)

+0

IMHO, 클래스 로더와 클래스 패스는 J2EE 환경에서 예측하기 힘든 부분 중 일부입니다. 시행 착오가 있습니다. Log4j가 구성 파일을 찾아서로드했기 때문에 파일이 작성되고 있다고 생각하지만 코드가이를 덮어 쓰고 빈 구성을로드했습니다. 또한 IMHO, 코드에서 컨 피규 레이터를 호출하지 않고도 log4j가 기본 위치에서 파일을 찾고 해당 작업을 수행하도록하는 것이 가장 좋습니다. – theglauber

관련 문제