Como inicializar log4j corretamente?

Depois de adicionar log4j à minha aplicação recebo a seguinte saída sempre que executo a minha aplicação:

log4j:WARN Nenhum appender pode ser encontrado para logger (slideselector.faceata.FaceDataParser).
log4j:WARN Por favor inicialize o sistema log4j corretamente.

Parece que isto significa que falta um ficheiro de configuração. Onde este arquivo de configuração deve ser localizado e o que é um bom conteúdo inicial?

I'm usando java simples para desenvolver uma aplicação desktop. Portanto, sem webserver, etc...

Solução

Log4j por defeito procura um ficheiro chamado log4j.properties ou log4j.xml no classpath. Você pode controlar qual arquivo ele usa para se inicializar definindo as propriedades do sistema como descrito aqui (Procure a seção "Procedimento de Inicialização Padrão").

Por exemplo:

java -Dlog4j.configuration=customName ....

Vai fazer com que o log4j procure um ficheiro chamado customName no classpath.

Se você estiver tendo problemas, acho útil ligar o log4j.debug:

-Dlog4j.debug

Ele irá imprimir para System.out muitas informações úteis sobre qual arquivo ele usou para se inicializar, quais loggers / appenders foram configurados e como, etc.

O arquivo de configuração pode ser um arquivo de propriedades java ou um arquivo xml. Aqui está um exemplo do formato do arquivo de propriedades retirado de a página de documentação de introdução do log4j:

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Comentários (5)

Encontre um log4j.properties ou log4j.xml online que tenha um appender raiz, e coloque-o no seu classpath.

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.rootLogger=debug, stdout

irá entrar na consola. Eu prefiro o registo a um ficheiro para que possa investigar depois.

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=100KB
log4j.appender.file.maxBackupIndex=5
log4j.appender.file.File=test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file

embora para aplicações de registo verboso 100KB normalmente precise de ser aumentado para 1MB ou 10MB, especialmente para depuração.

Pessoalmente eu configurei vários registradores, e configurei o registrador raiz para avisar ou nível de erro em vez de depurar.

Comentários (0)

Em que você está se desenvolvendo? Estás a usar o Apache Tomcat?

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss.SSS} [[%5p] %c{1} [%t]] %m%n

Eu tenho uma propriedade como esta numa aplicação Java minha.

Comentários (0)