2009-11-23 5 views
3

Log4J은 성가신 제한이있는 것처럼 보입니다 - 런타임에는 변수 대체가 작동하지 않는 것 같습니다. 이 예에서Log4J - 런타임 변수 대체

에게

파일 : Log4j.properties

FILE_PATTERN = % d의 ISO8601 {} % -5p %의 m %의 N

log4j.rootLogger = DEBUG, FileAppender

log4j.appender.FileAppender = org.apache.log4j.FileAppender log4j.appender.FileAppender.layout = org.apache.log4j.PatternLayout log4j.appender.FileAppender.layout .ConversionPattern = $ {} FILE_PATTERN 가 log4j.appender.FileAppender.File = log4jtest1.log

가 log4j.appender.FileAppender.Threshold = ERROR가

log4j.properties 파일 구성된 FileAppender 올바른 생산

출력 :

파일 : log4jtest1.log

ERROR 샘플 오류 메시지 FATAL 샘플 치명적인 메시지

내가 런타임에 FileAppender를 만들려고하면 17,451,515,

import org.apache.log4j.FileAppender; 
import org.apache.log4j.Level; 
import org.apache.log4j.Logger; 
import org.apache.log4j.PatternLayout; 

public class Main { 
    static final Logger logger = Logger.getLogger(Main.class); 

    public static void main(String[] args) throws Exception { 

     FileAppender appender = new FileAppender(); 
     appender.setFile("log4test2.log"); 

     PatternLayout pl = new PatternLayout("${file_pattern}"); 

     appender.setLayout(pl); 
     appender.setName("log4jtest2"); 
     appender.setThreshold(Level.ERROR); 
     appender.activateOptions(); 
     logger.addAppender(appender); 

     logger.trace("Sample trace message"); 
     logger.debug("Sample debug message"); 
     logger.info("Sample info message"); 
     logger.warn("Sample warn message"); 
     logger.error("Sample error message"); 
     logger.fatal("Sample fatal message"); 
    } 
} 

테 출력은

파일입니다 log4jtest2.log

$ {FILE_PATTERN} $ {FILE_PATTERN}

누구나 문제를 설명하고 어떻게 할 수 있습니까? 고정 되니?

관련 질문 : 대체 할 변수를 읽으려면 응용 프로그램에서 ResourceBundle에 액세스 할 수 있습니까?

답변

7

변수 대체는 PatternLayout이 아닌 PropertyConfigurator의 기능입니다. 코드를 보면, file_pattern을 정의 할 필요가 없습니다. 하지만 왜 코드에서 변수 대체가 필요합니까? 그냥 다음과 같이하십시오 :

PatternLayout pl = new PatternLayout("%d{ISO8601} %-5p %m%n"); 

그 문자열을 다른 곳에서 참조하려면 그냥 상수로 만드십시오.

편집 : 속성 개체를 읽어야하지만 PropertyConfigurator는 파일 대신 속성 개체를 사용할 수 있으므로이를로드하고 수행해야 할 작업을 수행 한 다음 PropertiesConfigurator에 전달하면되므로 하나의 구성 경로.

+0

글쎄, 그래이 쉽게 해결 될하지만 불행히도이 허용되지 않습니다. 그것은 내가 log4j를 읽어야 만하는 것처럼 보입니다.(예 : Properties 클래스 사용) 런타임시 file_pattern 변수의 값을 직접 적용하십시오. – Adrian

+1

변수 file_pattern이 Log4j.properties 파일에 정의되었습니다. – Adrian

+0

$ {file_pattern}을 사용하여 특성 파일의 값을 참조 할 수 없습니다 특성 파일 외부. 코드에서 자바 변수를 사용해야합니다. Log4j가 해당 속성을 노출하는지 확인하고 파일을 읽지 않아도됩니다. 그렇지 않다면 당신은 올바른 것입니다 : Properties 클래스. –

1

당신은 수동으로로드 할 수

Properties props = new Properties(); 
InputStream fis = new FileInputStream(new File("/somewhere/log4j.properties")); 
props.load(fis); 
fis.close(); 
PatternLayout layout = new PatternLayout(props.getProperty("file_pattern"));