Header Ads

Configurar o Log4j para gerar um novo arquivo de log a cada execução

Motivação

Algumas vezes nós precisamos manter um arquivo de log, com o log de vários dias, semanas ou meses, mas algumas vezes (um teste ou debug por exemplo) seria interessante criar um arquivo de log a cada execução no nosso programa.

Introdução

O Log4j é um bom framework de logging. Ele escreve logs no arquivo de log que nós especificamos no arquivo de configuração log4j.properties. Nós pudemos usar org.apache.log4j.RollingFileAppender para escrever para outro arquivo desde que o arquivo de log tenha excedido o limite que nós espeficicamos no arquivo de configuração. Nós também podemos usar org.apache.log4j.DailyRollingFileAppender cujo o qual escreve  para um arquivo diferente dependendo do padrão de data (DatePattern) que nós tenhamos especificado no arquivo de configuração. 
Mas no Log4j, não existe um FileAppender para criar um arquivo de log a cada nova execução do seu programa. Bom, nós podemos usar alguns hacks para criar um arquivo de log a cada execução do seu programa.

Usando o código

Vamos ver como fazer isto. O primeiro passo é criar um novo System properties na sua classe, no qual vamos carregar ele com a data e hora atual:

static{

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy-hh-mm-ss");
System.setProperty("current.date.time", dateFormat.format(new Date()));
}

Nós adicionaremos este código como um bloco static porque a JVM (Java Virtual Machine) executa blocos static quando carrega a classe na memória.
Agora, nós adicionamos no arquivo log4j.properties um novo file appender que utilizará esta propriedade static que criamos, como por exemplo:

log4j.appender.file.File=Log4jDemo_${current.date.time}.log
Isto criará um arquivo de log com o valor da propriedade current.date.time algo como Log4jDemoApp-dd-MM-yyyy-hh-mm-ss.log em cada vez que você executar seu programa. 

Código completo: Log4jDemo.java


import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.log4j.Logger;

public class Log4jDemo {

static{

SimpleDateFormat dateFormat =
new SimpleDateFormat("dd-MM-yyyy-hh-mm-ss");
System.setProperty(
"current.date.time", dateFormat.format(new Date()));
}

final static Logger log = Logger.getLogger(Log4jDemo.class);

public static void main(String[] args) {

log.trace(
"This is Trace Message.");
log.debug(
"This is Debug Message.");
log.info(
"This is Info Message.");
log.warn(
"This is Warn Message.");
log.error(
"This is Error Message.");
log.fatal(
"This is Fatal Message.");
}
}

Arquivo de configuração do log4j: log4j.properties

log4j.rootLogger=ALL, stdout, file

# Redirect logs to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Redirect logs to a file
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=Log4jDemo_${current.date.time}.log
log4j.appender.file.Append=false
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

Obs: Este é um artigo traduzido, com ligeiras modicações deste link:

          http://www.codeproject.com/Tips/1094802/Configure-Log-j-to-Generate-New-Log-File-for-Every

Nenhum comentário