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 SimpleDateFormatfuso 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.

Foi útil?

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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top