Log4j: Não grava em arquivo.log - Help!

9 respostas
F

Olá pessoal! :smiley:

Estou fazendo uns testes com a classe Logger aqui, e me deparei com um problema.
Tenho por exemplo o meu UsuarioDAO.java e no método login, se usuário for encontrado, é gerado um log no meu arquivo.log, funciona certinho se eu chamar o meu método a partir de uma classe main, mas quando eu chamo pela minha aplicação web, via formulário de login, não funciona, somente consigo printar o log no console, mas não grava no arquivo.

O que pode ser isso?

#log4j.properties

log4j.rootLogger=INFO, stdout, file

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=%2d{dd/MM/yyyy HH:mm} %5p [%t] (%F:%L) - %m%n

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=arquivo.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%2d{dd/MM/yyyy HH:mm} %5p [%t] (%F:%L) - %m%n

9 Respostas

J

Cara, troque FileAppender por RollingFileAppender .
Sugiro ainda que você acrescente MaxFileSize e MaxBackupIndex. O primeiro informa para o Log4J quantos arquivos de logs você deseja; O segundo informa qual o tamanho máximo destes arquivos. Isso é útil para manter um histório dos últimos logs em arquivos menores, permitindo assim que você mantenha um backup, para caso precisar enviar os logs por outros meios, como por exemplo, E-mail. Também útil para não permitir arquivo gigante de mais de 500MB. No exemplo abaixo teríamos 50MB dos últimos logs em 10 arquivos.

log4j.appender.file                                      =org.apache.log4j.RollingFileAppender
 log4j.appender.file.File                                =arquivo.log  
 log4j.appender.file.layout                            =org.apache.log4j.PatternLayout  
 log4j.appender.file.layout.ConversionPattern =%2d{dd/MM/yyyy HH:mm} %5p [%t] (%F:%L) - %m%n  

 log4j.appender.FILE.MaxBackupIndex	          =10
 log4j.appender.FILE.MaxFileSize	                  =5MB

Outra coisa que você deve observar é: garantir que o arquivo de Log seja carregado antecipamente (antes de salvar qualquer log) em algum ponto do seu sistema. Considere ainda que, o arquivo de configuração (log4j.properties) deve estar no classpath da aplicação, por exemplo dentro do diretório classes. É comum usar o seguinte código:

static{
			PropertyConfigurator.configure(Loader.getResource("log4j.properties"));  
}

Para que você tenha um log legível e útil, sugiro ainda que faça log por classes. Segue um exemplo:

public static Logger iniciaLog(Class<? extends Object> classe){
		return Logger.getLogger(classe);
	}

    Logger log = iniciaLog(this.getClass());
F
log4j.rootLogger=info, stdout, logMsg

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

log4j.appender.logMsg=org.apache.log4j.FileAppender   
log4j.appender.logMsg.file=arquivo.txt   
log4j.appender.logMsg.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) [%d{dd/MM/yyyy HH:mm:ss}]  - %m%n

Tenta trocar a extensão para txt.

log4j.appender.file.File=arquivo.log
F

jmoreira, obrigado pela ajuda! :D

Eu tava usando da seguinte forma:

public class UsuarioDAO{

      static Logger logger = Logger.getLogger(UsuarioDAO.class);

      public UsuarioDAO(){}

      public void insert(Usuario usuario) {
            Session sessao = HibernateUtil.getSessionFactory().openSession();
            Transaction tx = sessao.beginTransaction();
            sessao.save(usuario);
            tx.commit();
            sessao.close;
            
            logger.info("Usuário " + usuario.getNome() + " cadastrado com sucesso!");
      }
}

Quando executo o insert por um simples main o log tá sendo gerado mas na minha aplicação web nem sinal dele, senão no console, fiz as alterações mas continua não aparecendo =/

fnascimento, obrigado pela ajuda também :D
Fiz o que vc disse mas continua na mesma =/

Estou usando hibernate, e os logs dele também são configurados no log4j.properties, será que tem alguma coisa a ver?
Pois estes logs do hibernate também não são gerados no arquivo de log.

Onde mais posso estar errando?

M

felipempantoja,

de uma olhada em http://logging.apache.org/log4j/1.2/manual.html tem bastante dicas legais. Ha inclusive um topico chamado “Default Initialization under Tomcat” que explica como inicializar corretamente seu log4j.properties.

Marco.

R

Resta saber onde está o seu log4j.properties , vc colocou no CLASSPATH default? a principio no src do seu projeto.

F

sim ta no src sim, eu consigo gerenciar o log que aparece no console, mas no arquivo nem grava.

F

alguma sugestão? continuo com o problema =/

A

estou com o mesmo problema, alguém tem solução??

F

Sei que o tópico já tem um tempo mas aqui vai o que fiz para resolver a escrita no arquivo.

O problema era por causa da incompatibilidade das versões da classe (Logger.java) com nomes iguais porem de packages diferentes. Uma era do package commom e a outra era do package apache, na hora de fazer o import a maior parte das classes que interessavam era do package apache e a classe Logger.java foi incluida pelo package commom.

Ficou assim:

import org.apache.log4j.Logger; // <---- import org.apache.log4j.Priority;

O problema foi solucionado ao isolar a classe e as libs (no casos log4j.jar) de interesse em um projeto a parte dessa maneira a solução se revelou.

Bem…esta foi a conclusão em que cheguei espero que isto ajude o próximo.

flws

Criado 4 de abril de 2008
Ultima resposta 9 de jun. de 2011
Respostas 9
Participantes 7