2009-11-23 3 views
12

Можно ли указать часовой пояс, который будет использовать log4j? Мне нужно, чтобы даты в файле журнала были другим часовым поясом, чем приложение. log4j's PatternLayout использует SimpleDateFormat. К сожалению, не существует способа управлять часовым поясом SimpleDateFormat по строке шаблона (DateFormat имеет метод setTimeZone, но это не помогает).Укажите часовой пояс log4j's date

Я посмотрел на источник log4j, а SimpleDateFormat был инициирован в PatternParser.finalizeConverter. К сожалению, нет простого способа удержать DateFormat, чтобы установить часовой пояс.

ответ

16

Если вы используете файл JAR с дополнительными параметрами Log4J в вашем пути к классам, класс EnhancedPatternLayout поддерживает эту конфигурацию. См. Javadoc по номеру this link. Он обрабатывается как часть компоненты рисунка% D, как это:

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

Вы можете скачать пакет специальных принадлежностей here.

+0

В моем случае в журнале это происходит как {America/New_York} DEBUG [привет] - привет .. Я не знаю, почему его не работает –

+1

, так как 1.2.16 это часть самого log4j –

4

Шаблон журнала, приведенный выше, имеет правильную идею, но не полностью корректен (в журнале нет метки времени).
Используйте этот шаблон точно:
%d{ISO8601}{America/New_York} %p [%c] - %m%n
или
%d{ISO8601}{GMT-5} %p [%c] - %m%n

+0

Возможно, это сработало более старая версия. В любом случае, спасибо! – aditsu

8

Мой случай ... должен изменить PatternLayout к EnhancedPatternLayout. (log4j-1.2.17.jar)

log4j.appender.logfile.layout = org.apache.log4j. EnhancedPatternLayout log4j.appender.logfile.layout.ConversionPattern = [% d {} {ISO8601: GMT + 9}]% - 5p -% м% н

1

Также, если вы whant к dinamicaly obtein часовой пояс по умолчанию, вы можете расширить EnhancedPatternLayout и перезаписать метод «setConversionPattern», как это:

@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

предпочтительнее использовать что-то вроде {Америка/New_York} вместо {GMT-5}, так как указав часовой пояс автоматической регулировки будет если летнее сбережение работает. Указание чего-то типа GMT-5 будет просто настраивать часовой пояс GMT на указанное количество часов.

Смежные вопросы