Especifique o fuso horário da data de log4j
Pergunta
É possível especificar o fuso horário que o log4j usará? Eu preciso que as datas no arquivo de log sejam um fuso horário diferente do do aplicativo. Log4J's PatternLayout
usos SimpleDateFormat
. Infelizmente, não parece haver uma maneira de controlar SimpleDateFormat
fuso horário de The Pattern String (DateFormat
tem setTimeZone
método, mas isso não ajuda).
Eu olhei para a fonte de log4j e SimpleDateFormat
está sendo instigado em PatternParser.finalizeConverter
. Infelizmente, não há uma maneira fácil de se apossar do DateFormat
Para definir o fuso horário.
Solução
Se você usar o arquivo LOG4J Extras JAR no seu caminho de classe, a classe EnhancedPatterNlayout suporta essa opção de configuração. Veja o Javadoc em esse link. É tratado como parte do componente de padrão %D como este:
log4j.appender.stdout.layout.ConversionPattern=%d{}{America/New_York} %p [%c] - %m%n
Você pode baixar o pacote extras aqui.
Outras dicas
Meu caso ... Deve alterar o PatternLayout para aprimorarpatternlayout. (log4j-1.2.17.jar)
log4j.appender.logfile.layout = org.apache.log4j.EnhancedPatterNlayoutlog4j.appender.logfile.layout.conversionPattern = [%d {iso8601} {gmt+9}]% - 5p -%m%n
O padrão de log acima tem uma ideia certa, mas não totalmente correta (você não recebe nenhum registro de data e hora no log).
Use este padrão com certeza:
%d{ISO8601}{America/New_York} %p [%c] - %m%n
ou
%d{ISO8601}{GMT-5} %p [%c] - %m%n
É preferível usar algo como {America/new_york} em vez de {GMT-5} porque, ao especificar um fuso horário, um ajuste automático será feito se a economia do dia estiver operacional. Especificar algo como GMT-5 simplesmente ajustará o fuso horário da GMT pela quantidade especificada de horas.
Além disso, se você estiver com a dinâmica obtendo o fuso horário padrão, poderá estender o EnhancedPatternlayout e substituir o método "setConverSionPattern" como este:
@Override
public void setConversionPattern(String conversionPattern) {
String defaultTimeZoneId = TimeZone.getDefault().getID();
String conversionPatternModif = conversionPattern.replaceAll(
"\\%d\\{([^\\{\\}]*)\\}([ ]*[^\\{]*)",
"%d{$1}{"+defaultTimeZoneId+"}$2");
super.setConversionPattern(conversionPatternModif);
}