2009-11-23 4 views
12

log4j에서 사용할 표준 시간대를 지정할 수 있습니까? 로그 파일의 날짜가 응용 프로그램과 다른 시간대가 필요합니다. log4j의 PatternLayoutSimpleDateFormat을 사용합니다. 불행히도 패턴 문자열 (DateFormat에는 setTimeZone 방법이 있지만 도움이되지 않음)을 통해 SimpleDateFormat의 시간대를 제어하는 ​​방법이없는 것 같습니다.log4j 날짜의 시간대 지정

log4j의 소스를보고 SimpleDateFormatPatternParser.finalizeConverter에 저장되어 있습니다. 불행히도 DateFormat을 잡아서 시간대를 설정하는 쉬운 방법은 없습니다.

답변

16

classpath에 Log4J extras JAR 파일을 사용하면 EnhancedPatternLayout 클래스가이 구성 옵션을 지원합니다. Javadoc (this link)을 참조하십시오. 그것은이 같은 % d의 패턴 구성 요소의 일부로 취급 것 :

log4j.appender.stdout.layout.ConversionPattern=%d{}{America/New_York} %p [%c] - %m%n 

당신은 여분의 패키지 here을 다운로드 할 수 있습니다.

+0

는 {미국/뉴욕은} DEBUG [인사] - 그것은 log4j를 자신의 일부 –

+1

1.2.16 이후 작동하지 –

4

위의 로그 패턴에는 올바른 아이디어가 있지만 완전히 정확하지는 않습니다 (로그에 타임 스탬프가 표시되지 않음).
확실히이 패턴을 사용
%d{ISO8601}{America/New_York} %p [%c] - %m%n
또는 %d{ISO8601}{GMT-5} %p [%c] - %m%n

+0

어쩌면 근무의 이유 안녕하세요 .. 모르겠어요 이전 버전. 어쨌든 감사합니다! – aditsu

8

내 케이스
... 는 EnhancedPatternLayout에 PatternLayout을 변경해야합니다. (log4j-1.2.17.jar)

log4j.appender.logfile.layout = org.apache.log4j. EnhancedPatternLayout log4j.appender.logfile.layout.ConversionPattern = % d의 ISO8601 {} {9} GMT +] % - 5P - %의 m %의 N 또한

1

기본 시간대 obtein dinamicaly whant하는 경우, 이 같은 "setConversionPattern"EnhancedPatternLayout을 확장하고 방법을 덮어 쓸 수 있습니다 :

@Override 
public void setConversionPattern(String conversionPattern) { 
    String defaultTimeZoneId = TimeZone.getDefault().getID(); 
    String conversionPatternModif = conversionPattern.replaceAll(
     "\\%d\\{([^\\{\\}]*)\\}([ ]*[^\\{]*)", 
     "%d{$1}{"+defaultTimeZoneId+"}$2"); 

    super.setConversionPattern(conversionPatternModif); 
} 
+0

감사합니다,이 작품은 나를 위해 :) – toantran

2

같은 것을 사용하는 것이 바람직하다 {미국/뉴욕}보다는 {GMT-5} 시간대를 지정하여 자동 조정이되기 때문에 일광 절약이 작동하는 경우에 만들어졌습니다. GMT-5와 같은 것을 지정하면 GMT 시간대를 지정된 시간만큼 조정합니다. 그것으로 오는 로거 내 경우