domingo, 12 de janeiro de 2014

LOG4J

Log4j é um Framework utilizado para o desenvolvimento de Softwares que necessitam de recursos de
geração de logs. Bem, o Tomcat já possui estes recursos, basta que sejam ativados.
Segue os passos para ativar a geração de logs e o rotacionamento de arquivos de log:

Baixe o Log4j e o commons-logging:

- Log4j ->http://logging.apache.org/site/binindex.cgi
- Commons-logging ->http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi

Descompacte os dois arquivos, entre no diretório descompactado do Log4j vá em dist/lib, copie o .jar para $TOMCAT_HOME/common/lib.

Agora entre no diretório descompactado do commons-logging, copie o commons-logging-x.x.jar para $TOMCAT_HOME/common/lib

Crie o arquivo de configuração log4j.properties dentro de $TOMCAT_HOME/common/classes

Conteúdo e descrição do arquivo:

  # Início - log4j.properties
  log4j.rootLogger=INFO, LOG
  log4j.appender.LOG=org.apache.log4j.RollingFileAppender
  log4j.appender.LOG.layout=org.apache.log4j.PatternLayout
  log4j.appender.LOG.layout.ConversionPattern=%d [%t] %p %c - %m%n
  log4j.appender.LOG.File=$TOMCAT_HOME/logs/catalina.out
  log4j.appender.LOG.MaxFileSize=10MB
  log4j.appender.LOG.MaxBackupIndex=10
  # Fim

Conceitos importantes:

Appender - Qual os destinos das mensagens de log (arquivos, console, email etc.).

Layout - Formatação das mensagens de log.

log4j.rootLogger=INFO, LOG -> Define o nível das mensagens de log e um nome para o appender, os níveis podem ser: INFO, DEBUG, WARN, ERROR, FATAL,ALL e OFF.

log4j.appender.LOG=org.apache.log4j.RollingFileAppender -> Define o appender, neste caso o appender RollingFileAppender é utilizado para rotacionar os arquivos de log. Existem vários appenders diferentes, como por exemplo SMTPAppender utilizado para enviar as mensagens de log por email.

log4j.appender.LOG.layout=org.apache.log4j.PatternLayout -> Define qual layout (formatação das mensagens) será usado, PatternLayout depende da regra abaixo.

log4j.appender.LOG.layout.ConversionPattern=%d [%t] %p %c - %m%n -> Personalização da saída das mensagens, descrição:
- %d - Mostra a data e a hora em que a mensagem foi gerada.
- %t - Mostra qual thread gerou a mensagem.
- %p - Mostra o nível das mensagens.
- %c - Mostra a classe que gerou o erro.
- %m - Mostra a mensagem de log.
- %n - Quebra a linha.

Exemplo:

- 2006-06-20 15:20:26,122 [main] INFO org.apache.catalina.startup.Catalina -
Server startup in 54689 ms
- log4j.appender.LOG.File=$TOMCAT_HOME/logs/catalina.out -> Caminho onde será
armazenado o arquivo de log.
- log4j.appender.LOG.MaxFileSize=10MB -> Tamanho máximo que o arquivo pode
atingir antes de ser rotacionado.
- log4j.appender.LOG.MaxBackupIndex=10 -> Numero de arquivos utilizados para o
rotacionamento.

Depois de tudo isso basta iniciar o Tomcat para que Log4j entre em ação.

OBS (opcao na instalacao):
descompacte o arquivo jakarta-log4j-X.X.X.zip em um diretório de sua escolha e adicione a seguinte entrada ao seu CLASSPATH:
<diretório onde você descompactou o log4j>/dist/lib/log4j-X.X.X.jar

Está na hora de colocar o Log4J pra funcionar. Primeiramente, é preciso saber que o Log4J divide os logs em níveis hierárquicos (do nível mais baixo ao mais severo):

- DEBUG
- INFO
- WARN
- ERROR
- FATAL

Isso traz uma grande vantagem: é possível ajustar o nível de logging que você quer utilizar. Por exemplo: se você, testando sua aplicação, insere instruções de nível DEBUG, você poderia facilmente desligar este nível depois dos testes sem precisar apagar as instruções dentro do código.

Vamos aos exemplos:

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...?);
     }   

No código acima, o objeto da classe Logger é usado para enviar as mensagens de log. Primeiramente, é chamado o método
1 BasicConfigurator.configure() 

, que inicializa o sistema de logging com as configurações padrão. A seguir, o método setLevel() é utilizado para ajustar o nível de logging para INFO. A primeira instrução que realmente envia uma mensagem para o log é logger.debug(?Isso não vai aparecer...?);
Note que o nível de logging foi ajustado para INFO, que é um nível acima de DEBUG, portanto essa instrução não enviará nada para o log.

É possível enviar as mensagens de log para mais de um dispositivo de saída. Por exemplo: quando você faz uma chamada ao método configure() da classe BasicConfigurator, o Log4J é iniciado com a sua configuração padrão. Porém, muitas vezes é interessante armazenar um arquivo de log, para que as mensagens possam ser analisadas posteriormente. Para solucionar esse problema, o Log4J implementou os Appenders.

Um appender representa um dispositivo de saída de log. Para que um arquivo seja criado com as mensagens de log da sua aplicação, é necessário registrar um FileAppender para sua instância de Logger. Isto é feito através do método addAppender(). Exemplo:

import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.Appender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.BasicConfigurator;

public class LoggingToFile {
    static Logger logger = Logger.getLogger(LoggingToFile.class);

    public static void main(String[] args) throws IOException {
        BasicConfigurator.configure();

        /* Cria um novo FileAppender baseado no layout padrão,
         * pré-definido na constante TTCC_CONVERSION_PATTERN
         * da classe PatternLayout. */
Appender fileAppender = new FileAppender(
            new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN), ?myLogFile.log?);
       
         logger.addAppender(fileAppender);
       
        try {
            throw new Exception(?Loga esse no arquivo, Log4J!?);
        } catch (Exception e) {
            logger.error(?Oops, deu erro: ? + e.getMessage());
        }
    }   

A novidade no código acima fica por conta da parte que registra um novo appender, no caso, um FileAppender, que armazena as mensagens de log em um arquivo. O construtor de FileAppender aceita dois argumentos: o primeiro é o Layout das mensagens; o segundo, o nome do arquivo de log que será criado. Vale lembrar que se o arquivo especificado já existir, as mensagens serão escritas no final do arquivo, mantendo o conteúdo já existente; senão, o Log4J criará o arquivo para você.

Além do FileAppender, existem ainda as classes ConsoleAppender (padrão, para mensagens no console), JDBCAppender (banco de dados), SMTPAppender (servidores de e-mail SMTP), SocketAppender (para servidores remotos) e IMAppender (para instant messengers!).
No nosso exemplo, as mensagens serão gravadas com o mesmo layout das mensagens padrão que vão para o console. Este layout é pré-definido na constante TTCC_CONVERSION_PATTERN da classe PatternLayout. Existem vários outros layouts que podem ser usados, representados pelas classes SimpleLayout, DateLayout, HTMLLayout e XMLLayout. Todas essas classes estendem a superclasse abstrata Layout. Além desses layouts pré-definidos, você pode criar seu próprio layout, criando uma subclasse de Layout e implementando seus métodos.     

Nenhum comentário:

Postar um comentário