2014-11-26 3 views
0

log4j2와 롤링 파일 appender를 사용하여 크기와 시간에 따라 파일을 롤백합니다.Log4j2 : RollingFile Appender에서 동적으로 파일명 변경

log4j2.xml

<RollingFile name="RollingFile" filename="log/${date:dd-MM-yyyy-HH}/currentRoll.log" filePattern="log/%d{dd-MM-yyyy-HH}/Roll-%i.log"> 
     <PatternLayout> 
      <Pattern>%d{ISO8601}{GMT} %p %c{1.c} [%t] %m%n</Pattern> 
     </PatternLayout> 

     <Policies> 
      <TimeBasedTriggeringPolicy interval="1"/> 
      <SizeBasedTriggeringPolicy size="3KB"/> 
     </Policies> 
    </RollingFile> 

    <Console name="STDOUT" target="SYSTEM_OUT"> 
     <PatternLayout> 
      <Pattern>%d{ISO8601}{GMT} [%t] %-5p %c{1}: %m%n</Pattern> 
     </PatternLayout> 
    </Console> 

</Appenders> 

<loggers> 
    <Root level="info"> 
     <AppenderRef ref="Async"/> 
    </Root> 
</loggers> 
</Configuration> 

내 더미 로깅 클래스 : 여기 내 설정 파일 및 더미 예입니다

public class Helloworld extends TimerTask { 
private static final Logger logger=LogManager.getLogger("HelloWorld"); 


@Override 
public void run(){ 
    logger.info("fake info message"); 
    logger.info("another fake info message"); 
} 
} 

내 문제는 내 전류를 로그 (currentRoll.log) 파일은 일 때 처음 생성 된 폴더에 있습니다. 프로그램이 시작되었습니다. 나는 그것이 마지막에있을 필요가있다. 따라서 예를 들어 2014 년 11 월 25 일 오후 1시에 프로그램을 실행하기 시작한 경우 오후 3시에 나는 25-11-2014-15 폴더에는 없지만 25-11-2014에있는 현재 로그를보고 싶습니다. -13 폴더.

내 생각에 ${date:dd-MM-yyyy-HH}은 동적으로 확인되지 않습니다.

<Configuration status="info" name="MyApp" packages="" monitorInterval="5"> 

과에서와 같이 "$$"사용 : 저는 모니터의 간격을 사용하여 자동 recofniguration 폴링을 시도 $${date:dd-MM-yyyy-HH}을하지만이 나에게 다음과 같은 오류 제공 :

"2014-11-26 17:22:27,143 ERROR Unable to create file log/${date:dd-MM-yyyy-HH-mm}/currentRoll.log java.io.IOException: The filename, directory name, or volume label syntax is incorrect 

내가 log4net가 datePattern을 가지고 알고를 이 문제를 해결할 수있는 매개 변수가 있지만 log4j2에 해당하는 항목을 찾을 수 없습니다.

어떻게해야할까요?

답변

1

롤링 어 펜더에 사용되는 날짜는 롤링 로그 파일을 만들 때 결정됩니다. 또는 log4j 용어에서 "전체 RollingFile 요소의 해결은 일치가 발생할 때까지 연기됩니다." 즉, {date} 속성은 파일을 굴릴 때만 지정된 해상도로 보간됩니다.

많은 속성에 $$ 기능을 사용할 수 있습니다.하지만 {date}가 그 중 하나인지 확실하지 않습니다. 필자는 파일 식별자가 "$ {date ...}"를 포함 할 것이라는 느낌이 들었습니다. 이것은보고있는 오류의 근원 일 수 있습니다.

필자는 이전에 "속성"섹션에서 기본값을 설정할 수있는 appender 파일 이름에서 "$$ {sys : someProperty}"를 통해 시스템 속성을 사용하려했지만, 로거를 호출하기 전에 시스템 속성을 설정하거나 일 수 있습니다.은 기본값 만 사용하는 롤링 파일로 끝납니다.

Log4J 문서 (property substitution)를 참조하십시오.

결국 내 솔루션은 프로그래밍 방식으로 로거를 구현해야하므로 로그 파일의 루트 이름을 변경하고 최종 사용자 친화적 인 속성을 간단한 속성 파일로 추상화하여 XML 파일.

+0

답장을 보내 주셔서 감사합니다. 로거를 구현한다고 말하는 것이지만 Appender를 구현하는 것으로 충분하지 않습니까? –

+0

맞습니다. 저는 Appender에 대해 이야기하고 있습니다. 하지만, 내가 발견 한 것은 appender에서 출력 파일의 이름을 바꾸는 것이 까다로운 일이라는 것입니다. $$ {sys : somePropName}을 사용하고 로거가 호출되기 전에 코드에서 somePropName을 설정할 수 있습니다.귀하의 경우에는 $$을 통해 나중에 {date}를 대체 할 수 있는지 확신 할 수 없으며 (모든 속성이 지원되는 것은 아니며) 그렇다고하더라도 "일치"가 발생할 때 변수가 평가됩니다. 이것은 당신이 원하는 것일 수도 아닐 수도 있습니다. 기존의 로거 컨텍스트를 구성하는 대신 Java 코드로 전체 Logger를 프로그래밍 방식으로 구현하는 것이 더 쉽습니다. – jdv

+0

질문에 대답하기 위해 appender 만 프로그래밍 방식으로 구현할 수 있는지, 기본 제공되는 기본 루트 Logger를 사용하는지는 알 수 없습니다. 나는 그렇지 않다고 추측 하겠지만, 나는 아직 그 길을 걷지 않았다. – jdv