2013-12-13 10 views
6

File appender를 프로그래밍 방식으로 설정해야합니다.LOG4J2 - 프로그래밍 방식으로 파일 작성기를 만드는 방법은 무엇입니까?

에 내 appenders를 설정하고 싶습니다. log4j2.xml하지만 런타임에이 appenders 중 하나에만 (프로그래밍 방식으로) 작성하고 싶습니다. 그들이 런타임에 프로그램 펜더를 추가하는 방법을 설명하는 인터넷의 다양한 튜토리얼에서 찾고

 if(condition.equals("A")){ 
      //write log on File_1 
     }else if(condition.equals("B")){ 
       //write log on File_2 
     }else { 
       //write log on File_3 
     } 

;

<Configuration status="WARN"> 
<Appenders> 
    <File name="File_1" fileName="c:/FILE_1.log" > 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </File> 
    <File name="File_2" fileName="c:/FILE_2.log" > 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </File> 
    <File name="File_3" fileName="c:/FILE_3.log" > 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </File> 
</Appenders> 
<Loggers> 
    <Root level="debug"> 
     <AppenderRef ref="File_1"/> 
     <AppenderRef ref="File_2"/> 
     <AppenderRef ref="File_3"/> 
    </Root> 
</Loggers> 
런타임에 을 선택하는 방법이 xml 구성 파일에 정의 된 appenders 중 하나만 있습니까?

첫 번째 해결 방법 :

나는 다음과 같은 방법으로 문제를 해결하기 위해 노력했습니다,하지만 log4j2.xml에 정의 된 파일 프로그래밍 및 제거되지 않습니다 때문에 나는 내 솔루션에 의해 만족하고 있지 않다 첫 번째 Appender는 절대로 제거되지 않습니다! 나는 log4j2에 버그가 있다고 생각 : https://issues.apache.org/jira/browse/LOG4J2-135 내가 log4j2 팀에 문제를보고

static org.apache.logging.log4j.core.Logger coreLogger =  
(org.apache.logging.log4j.core.Logger)LogManager.getLogger(MyClass.class.getName()); 
static LoggerContext context = (LoggerContext)coreLogger.getContext(); 
static BaseConfiguration configuration = (BaseConfiguration)context.getConfiguration(); 

static String FILE_1 = "File_1"; 
static String FILE_2 = "File_2"; 
static String FILE_3 = "File_3"; 

private static Map<String, Boolean> appendersMap; 
static 
{ 
    appendersMap = new HashMap<String, Boolean>(); 
    appendersMap.put(FILE_1, true); 
    appendersMap.put(FILE_2, true); 
    appendersMap.put(FILE_3, true); 
} 

/** 
* Configure appenders. 
* 
* @param appender the appender 
*/ 
public static void configureAppenders(String appender){ 

    if(appender.equals(FILE_1)){ 
     addAppenders(FILE_1); 
     removeAppenders(FILE_2,FILE_3); 
    } 

    else if(appender.equals(FILE_3)){ 
     addAppenders(FILE_3); 
     removeAppenders(FILE_1,FILE_2); 
    } 

    else if(appender.equals(FILE_2)){ 
     addAppenders(FILE_2); 
     removeAppenders(FILE_1,FILE_3); 
    } 

} 

private static void addAppenders(String appender){ 
    if (!appendersMap.get(appender)){ 
     appendersMap.put(appender, true); 
     coreLogger.addAppender(configuration.getAppender(appender)); 
    } 
} 

private static void removeAppenders(String... appenders){ 
    for(String appender : appenders){ 
     appendersMap.put(appender, false); 
     coreLogger.removeAppender(configuration.getAppender(appender)); 
    } 
} 
+1

시스코, 내 코드가 내게 많은 도움이되었습니다. 나는 당신의 코드를 볼 때까지 내 appenders를 연결할 수 없었다. –

답변

1

그것은이 질문은 질문 이후 오랜만 있으며, Log4j를 2.4으로 더 나은 프로그램 구성의 Log4j 2에 대한 지원 요청의 수가 있었다, API는 다음의 제품에 log4j를 코어에 추가 용이하게 programmatic configuration.

새로운 ConfigurationBuilder API를 사용하면 사용자가 구성 요소 을 구성 할 수 있습니다. 이 API를 사용하면 실제 구성 객체 (예 : LoggerConfig 및 FileAppender)로 직접 작업 할 필요가 없으므로 Log4j가 어떻게 작동하는지에 대한 많은 지식이 필요합니다. 구성 요소 정의가 ConfigurationBuilder에 추가되고 모든 정의가 수집되면 모든 실제 구성 객체 (예 : 로거 및 애펜더)가 구성됩니다. Java 코드를 작성한다는 점을 제외하면 XML 구성 구문과 조금 비슷합니다. 새로운 ConfigurationBuilder API가 에 대한 사용자 코드가 새로운 구성을 만들거나 완전히 기존 구성을 대체 할 수 있다는

참고. 유스 케이스가 다르며 프로그래밍 방식으로 Log4j를 시작한 후 기존 구성을 (바꾸는 것이 아니라)으로 수정하면 실제 구성 객체로 작업해야합니다. 이 경우 설명서의 Programmatically Modifying the Current Configuration after Initialization 섹션을 참조하십시오.

당신이 내부 구성 개체와 직접 작업 할 수 필요성을 경우, 변경 사항을 적용하려면 끝에 LoggerContext.updateLoggers() 또는 Configurator.initialize(Configuration) 중 하나를 호출 할 필요가 있음을 유의하시기 바랍니다.예 :

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
final Configuration config = ctx.getConfiguration(); 
... // make changes 
ctx.updateLoggers(); // NECESSARY! 
0

이것은 나를 위해 작동합니다. 방법을 잘 모르겠습니다. 로거를 업데이트하지 않았거나 컨텍스트를 다시 구성하지 않았습니다.

Logger coreLogger = (Logger)LogManager.getLogger(LoggingStuff.class.getName()); 
    Layout layout = ((LoggerContext)LogManager.getContext()).getConfiguration().getAppender("Console").getLayout(); 
    Appender appender = FileAppender.newBuilder().withName("File").withFileName("target/bash.log").withLayout(layout).build(); 
    appender.start(); 
    coreLogger.addAppender(appender); 
+0

확실하지 않은 경우 어떻게 답변으로 게시 할 수 있습니까? – Billa

+0

음, 일을합니다.하지만 어떻게 작동하는지에 대한 설명은 유용 할 것입니다. – Ash