Gostaria de saber como fazer logging da sua aplicação Java? Quer mesmo? Então leia este artigo escrito por Caio Filipini, em que ele mostra como é fácil fazer logging usando a biblioteca Log4J, da Apache Software Foundation.
Introdução ao Log4J
47 Respostas
AEEEEEEE!!

Parabens, Caio, ficou mto legal 
Mandou bem.
Muito bom o artigo, claro e conciso, acho que o Log4J é uma das API’s mais difíceis de se usar de forma adequada.
Parabéns! 
Valeu pessoal! 
Espero que o artigo ajude a alguém… Não sou especialista em Log4J, apenas trilhei o caminho que usei pra aprender a usá-la, e isso talvez facilite a vida de alguém. 
[]'s
Taí,gostei…derrepente tem uma vaguinha pro Log4j no meu projeto final…Jah tava começando a fazer via java.util.logging…
Bom artigo Caio! 
Valeu, Ironlynx!

como sou muito newbie em java, alguma coisa tinha q dar errado…
como faço pra implementar o exemplo ?
pq quando tento compilar este treco:
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.BasicConfigurator;
public class LoggingTest {
static Logger logger = Logger.getLogger(LoggingTest.class);
public static void main(String[] args) {
BasicConfigurator.configure();
logger.setLevel(Level.INFO);
logger.debug(“Isso nao vai aparecer...”);
logger.info(“Inicializando...”);
try {
throw new Exception(“Loga esse, Log4J!”);
} catch (Exception e) {
logger.error(“Oops, deu erro: “ + e.getMessage());
}
logger.info(“Finalizando...”);
}
}
Ele diz que não encontra as classes que estão no import…
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.BasicConfigurator;
O que devo fazer ??
copiar algum .jar, pra dentro do meu jdk ?
e como irei ver o resultado do logger.info ?
preciso fazer alguma chamada ?
façam contato via icq ou msn.
grato,
Jovan
Deixe os .jar do Log4J em um lugar “vísivel” para sua aplicação. Pode ser CLASSPATH, pode ser no mesmo diretório em que estiver o seu .class .
seguinte,
seguindo o tutorialzinho de log4j, coninuo encontrando o seguinte problema:
br/com/streamworks/projetos/controleremoto/aplicacao/testes/LoggingTest.java [13:1] package org.apache.log4j does not exist
import org.apache.log4j.Logger;
^
br/com/streamworks/projetos/controleremoto/aplicacao/testes/LoggingTest.java [14:1] package org.apache.log4j does not exist
import org.apache.log4j.Level;
^
br/com/streamworks/projetos/controleremoto/aplicacao/testes/LoggingTest.java [15:1] package org.apache.log4j does not exist
import org.apache.log4j.BasicConfigurator;
ou seja, ele não encotra o pacotre do log4j
daonde vem este org.apache.log4j ???
isso ta parecendo, que devo colocar o log4j dentro do diretorio do apache…
mas ja repliquei o arquivo .jar do log4j em diversos diretórios…
coloquei na minha aplicacao,
coloquei no diretorio lib do jdk
coloquei até dentro do diretorio lib do toncat…
ah sim, alterei a variavel de ambiente CLASSPATH corretamente, tb, de acordo com a instrucao abaixo:
<diretório onde você descompactou o log4j>/dist/lib/log4j-X.X.X.jar
por favor, me informem onde devo colocar este .jar exatamente, para que o pacote do loc4j, venha a ser encontrado
aguardo o retorno.
sds,
Jovan
PQPEEEEE
CONSEGUI
foi no esquema de tentativa e erro…
coloquei no diretorio:
C:\nomedoprojeto\WEB-INF\lib
(pq meu projeto ta em uma pasta de web, pra jsp)
funcionou como um milagre
agora vamos para a implementação.
log4j sux.
só tenho isso a dizer.
Ele faz de conta que é configurável, mas pra vc ter um logger só em todas as classes do seu pacote vc tem que fazer na mão… muito burro!!
Ou será que os experts me convencem do contrário??
Tudo de bom!
realmente to ralando um pouco pra fazer a coisa funcionar por aqui:
Já tenho minhas classes mysqlHandler e MySqlConnectionHandler prontas...
Já tá tudo compilando, mas não to sabendo muito bem como aplicá-las.
Vejam só:package br.com.projeto.conecta;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import org.apache.log4j.jdbcplus.JDBCConnectionHandler;
/**
* Implement a sample JDBCConnectionHandler for MySQL database
*/
public class MySqlConnectionHandler implements JDBCConnectionHandler {
Connection con = null;
String url = "jdbc:mysql://localhost/projeto?user=root&password=";
String username = "root";
String password = "";
static {
try {
// load driver
Driver dMySql = (Driver) (Class.forName("com.mysql.jdbc.Driver").newInstance());
DriverManager.registerDriver(dMySql);
} catch (Exception e) {
System.err.println("Could not register driver.");
e.printStackTrace();
}
}
public Connection getConnection() {
return getConnection(url, username, password);
}
public Connection getConnection(String _url, String _username, String _password) {
try {
if (con != null && !con.isClosed())
con.close();
con = DriverManager.getConnection(url);
con.setAutoCommit(false);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
}
package br.com.projeto.aplicacao.conecta;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.jdbcplus.JDBCSqlHandler;
public class MySqlHandler implements JDBCSqlHandler {
private int inc = 0;
public String getStatement(LoggingEvent event) throws Exception {
return "INSERT INTO LOGTEST (id, msg, created_on, created_by) VALUES ("
+ ++inc
+ ", '"
+ event.getMessage()
+ "', sysdate, 'MySqlHandler')";
}
}
To com um problema.
Tenho um servlet que chama uma classe chamada Database, nesta classe tenho o log4j configurado, mas exceção ocorre nesta parte:
static Logger logger = Logger.getLogger(LoggingTest.class); ele não acha o .class por causa que ele se encontra em outra pasta da aplicação, como faço por exemplo se meus .java estão em src e meus .class estão em classes fazer ele pegar a .class na pasta certa?
não consigo acessar… 
Não consegue acessar o que?
o tutorial!!!
O tutorial não está mais disponível? Fiquei muito curioso sobre como utilizar bem o LOG4J. Por favor, disponibilizem novamente o tutorial.
Grato,
Editei o link, que estava usando as URLs antigas do GUJ. Valeu.
[]'s
Olá, gostaria de repassar minha experiência com Log4j.
Estou em um projeto (Pluglet) que precisa de muito log (é um gerador de código à partir de modelos UML 2.0 para EJB).
Foi tentado colocar o log4j no Pluglet (rodando em IBM RSA/RSM) e gerou exception no layout.
Recebi como resposta do suporte da IBM que o log4j não trabalha junto a projetos Pluglet e que deveria neste caso implementar um servidor de log (chamando o log4j) comunicando-se com o pluglet.
Então, eis um caso onde não se aplica o log4j.
Abraços.
Analisando o JavaDoc da API Lo4j, versão 1.2.11, em especial a documentação referente ao uso da classe JDBCAppender, verifiquei que a mesma será substituída futuramente, pois ela não prevê o registro de exceções que ocorrem no código. Gostaria de saber se alguém já tentou fazer os testes para verificar qual tipo de erro ocorreu, e qual é o impacto (desastre) oriundo do mesmo dentro de uma aplicação de médio a grande porte.
Obrigada,
Angela Albarello
Oi,
Gostaria de obter mais exemplos para o uso e configuração da classe JDBCAppender.
Angela Albarello
Olá Angela aqui é apenas pra discutir pontos positivos / negativos do tutorial, algo que ficou faltando… etc…
Se você gostaria mais exemplos poderia tentar o Google
( www.google.com.br )
Ou abrir um novo topico em uma outra parte do GUJ…
http://www.guj.com.br/forums/list.java
Outra dica é ler como fazer perguntas e abrir topicos…
How to ask smart questions.
Afinal de contas nao temos bola de cristal… 
Valeu? até… :thumbup:
[]'s
Manero o artigo…
Tá bem fácil de entender e oferece uma bagagem de conhecimento muito boa para que a pessoa que o leu possa se aprofundar por conta própria…
Show !
Muito legal o artigo, mas a forma de configuração que foi mostrada não é a mais utilizada…
Faltou mostrar como configurar em properties ou XML…
Mais infos sobre o log4j em : http://hotwork.sourceforge.net/hotwork/manual/log4j/log4j-user-guide.html
Abraços!
Cara, de boa…
este tutorial é EXCELENTE ! ! ! !! ! !! ! ! !! ! !
parabéns pela coesão e pela simplificação das idéias.
See ya
donatinho
Alguem sabe me dizer porque meus logs estão saindo sempre duplicados? já passaram por isso? veja o codigo:
private void initialize(){
BasicConfigurator.configure();
Appender fileAppender = null;
logger.setLevel(Level.INFO);
try {
Date data = new java.util.Date();
fileName = String.valueOf(dt.format(data));
fileName = getConfig().getPathLog()+"SysNews_"+fileName+".log";
String pattern = "[%r] "+getClasse()+" %-2d{dd/MM/yy HH:mm} - %m%n";
fileAppender = new FileAppender(new PatternLayout(pattern), fileName);
logger.addAppender(fileAppender);
} catch (IOException e) {
e.printStackTrace();
logger.error("Erro: "+e.getMessage());
}
}
Como faço para ler os arquivos gerados pelo log4j?
Quero exibir em uma jsp, por exemplo. O próprio log4j fornece recursos para leitura?
log4j sux.só tenho isso a dizer.
Ele faz de conta que é configurável, mas pra vc ter um logger só em todas as classes do seu pacote vc tem que fazer na mão… muito burro!!
Ou será que os experts me convencem do contrário??
Tudo de bom!
Como assim fazer na mão? Escrever a config toda do log4j em cada classe?
Se for isso acho que pode-se fazer assim:
Crie uma Exception que faça toda a config do log4j em um campo estático ou no próprio construtor e lá faça o log. Quando ela for lançada o log será gerado. E você pode criar varias exceptions para cada situação em que você queira um log diferente. Isso em log de erros.
Ótimo tutorial.
muito bom o tutorial, acho que soh faltou mesmo mostrar configuracao do log4j pelo .properties
Cade o tutorial?
HTTP ERROR: 404
NOT_FOUND
RequestURI=/java.artigo.130.1.guj
Powered by Jetty://
Se der da uma arrumada ae, por favor.
Obrigado. 
Se estão falando desse, seus problemas acabaram.
No menu verde tem uma opção com o título ARTIGOS. Entrando lá, pressione CTRL+F no seu browser favorito e digite log4j e, BINGO.
HTTP ERROR: 404NOT_FOUND
RequestURI=/java.artigo.130.1.guj
Powered by Jetty://
Se der da uma arrumada ae, por favor.
Obrigado.![]()
EDIT: Imaginem se os administradores fossem trocar todos os artigos, tutoriais, etc. linkados em TODAS as mensagens. Pelo amor de Deus.
Verdade, ao invés disso vamos deixar os links quebrados e não vamos notificas via pm os admin.
Afinal, da muito trabalho arrumar os links quebrados.
:thumbup:
Verdade, ao invés disso vamos deixar os links quebrados e não vamos notificas via pm os admin.
Afinal, da muito trabalho arrumar os links quebrados.
:thumbup:
Agora você está sendo coerente. Se quiser prestar o serviço de avisar aos admin’s via PM sobre os links que se encontrem quebrados, maravilha.
Mas avisar via broadcast não acrescenta em nada. Pior ainda se não se der ao trabalho de procurar o link correto, postando junto com a mensagem.
Já tinha sido avisado via pm logo apos o primeiro post.
Problema é falar sobre oque não sabe.
1-) eu ja tinha avisado por pm logo apos o primeiro post.
2-) Já tinha localizado o artigo e lido em seguida.
Isso ae champs, continua falando sobre oque não sabe ae.
:thumbup:
Gostaria de saber como posso gravar o log no servidor utilizando o Log4J.
Um abraco, muito obrigado. 
Segue um exemplo:
O segundo appender escreve em um arquivo
log4j.appender.fileOut =org.apache.log4j.RollingFileAppender
log4j.appender.fileOut.File=ioc.log
Full code (arquivo src/log4j.properties):
#### Usando 2 appenders, 1 para logar no console, outro para um arquivo
log4j.rootCategory=DEBUG, stdout, fileOut
# Imprime somente mensagens com 'priority' WARN ou mais alto para o logger
#lembrando a ordem: DEBUG - INFO - WARN - ERROR - FATAL
log4j.category.br.com.goals.hotcoffe.ioc=DEBUG
# Explicita a herança do nivel de prioridade
#log4j.category.your.category.name=INHERITED
#### O primeiro appender escreve no console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern que mostra o nome do arquivo e numero da linha.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
#### O segundo appender escreve em um arquivo
log4j.appender.fileOut =org.apache.log4j.RollingFileAppender
log4j.appender.fileOut.File=ioc.log
# Controla o tamanho maximo do arquivo
log4j.appender.fileOut.MaxFileSize=100KB
# Faz backup dos arquivos de log (apenas 1)
log4j.appender.fileOut.MaxBackupIndex=1
log4j.appender.fileOut.layout=org.apache.log4j.PatternLayout
log4j.appender.fileOut.layout.ConversionPattern=%p %t %c - %m%n
Caraca, sempre usei mais nunca soube como configurar.
Mto Bom…
Lembro que eu usava Sysout mesmo 
Alguém usa o logger da Sun?
Boa gostei bastante do tópico ajudou bastante…
Só tenho uma duvida, como altero o Layout do arquivo log que sera gerado ? alguem teria algum exemplo ??
valeuu
hahahahaha eu me raxei foi com os comentarios da galera, é cada uma mais engracada do que a outra :shock:
Topico que renasce…
Galera… ha bastante tempo, tenho uma aplicacao que ao roda-la aparece o seguinte:
log4j:WARN No appenders could be found for logger (org.apache.commons.configuration.ConfigurationUtils).
log4j:WARN Please initialize the log4j system properly.
Percebi depois que nenhum dos logs realmente grava nada no arquivo descrito no .properties
O que esta faltando no meu arquivo .properties ???
Segue o mesmo
# Log properties
log4j.rootCategory=INFO, myAppender
# XXX foi so pra ocultar o nome da empresa...
log4j.logger.br.com.XXX.integra=DEBUG, fileOut
log4j.appender.myAppender=org.apache.log4j.ConsoleAppender
log4j.appender.myAppender.Threshold=INFO
log4j.appender.myAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.myAppender.layout.ConversionPattern=[%d{dd/MM/yyyy HH:mm:ss}] [%5p] %m%n
log4j.appender.fileOut =org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileOut.Threshold=DEBUG
log4j.appender.fileOut.ImmediateFlush=true
log4j.appender.fileOut.File=logs/cont.log
log4j.appender.fileOut.DatePattern='.'yyyy-MM-dd
log4j.appender.fileOut.layout=org.apache.log4j.PatternLayout
log4j.appender.fileOut.layout.ConversionPattern=[%d{dd/MM/yyyy HH:mm:ss}] [%5p] {%F->%M} %m%n
Se alguem puder ajudar, agradeco…
Abracos 
[EDIT] Detalhe que soh nao funciona na minha maquina (pelo Eclipse) … Quando ele foi mandado para o ambiente de homologacao do cliente, funcionou bem. Assim quando gero o .jar e executo pelo Console…
Se alguém puder me explicar agradeço, estou precisando de uma ajuda…
Usando 2 appenders, 1 para logar no console, outro para um arquivo
log4j.rootCategory=DEBUG, stdout, fileOut
[color=red]Os dois appender provavelmetne devem ser o “stdout” e o “fileOut” mas e o “DEBUG”?? o que ele representa?
E onde esta definido que o fileOut e o stdout sao os appenders??[/color]
Imprime somente mensagens com ‘priority’ WARN ou mais alto para o logger
#lembrando a ordem: DEBUG - INFO - WARN - ERROR - FATAL
log4j.category.SEU.LOGGER.NAME=WARN
Explicita a herança do nivel de prioridade
#log4j.category.your.category.name=INHERITED
[color=red]Nao entendi muito bem essa herança de nivel de prioridade, se alguem puder me explicar melhor…[/color]
O primeiro appender escreve no console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
Pattern que mostra o nome do arquivo e numero da linha.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
O segundo appender escreve em um arquivo
log4j.appender.fileOut =org.apache.log4j.RollingFileAppender
log4j.appender.fileOut.File=example.log
Controla o tamanho maximo do arquivo
log4j.appender.fileOut.MaxFileSize=100KB
Faz backup dos arquivos de log (apenas 1)
log4j.appender.fileOut.MaxBackupIndex=1
log4j.appender.fileOut.layout=org.apache.log4j.PatternLayout
log4j.appender.fileOut.layout.ConversionPattern=%p %t %c - %m%n
Basicamente sao essas duvidas, nao entendi muito bem o que é o que nesse arquivo de configuraçao.
Cara, log4j eh muito enrolado e intrusivo. Dah uma olhada no MentaLog => http://mentalog.soliveirajr.com
é que eu tinha que fazer um trabalho falando sobre log4j
ele nem é dificil mas quando chega no log4j.properties começa o problema
nao consigo entender como configurar um log nesse acrquivo de configuraçao