Quinta-feira, 10 de julho de 2003 às 01h59

API de log do JAVA

Faltam -1 dias! Inscreva-se agora! O maior encontro de profissionais web da américa latina.

Olá, pessoal!

Começo esta coluna pedindo desculpas pelo atraso esta semana e por possíveis e-mails não respondidos. Esta semana tive um pequeno problema com o host do meu site que, simplesmente, parou de nos prestar o serviço, provocando assim o não recebimento de TODOS os e-mails enviados entre Domingo e ontem 20:00. Desculpem-me pelo transtorno.

Vamos ao nosso artigo. Falaremos hoje sobre a API de log do JAVA.

Let's rock!


A API

A API de logging permite que um programa, um servlet, um applet, ou qualquer outra aplicação JAVA gere mensagens a partir da aplicação. Um recurso interessante para manter o desenvolvedor, e até mesmo o usuário, a par de erros, resultados de operações, recursos acessados e outras informações pertinentes ao sistema.

Para garantir que o mecanismo de log não afetasse a performance do sistema, a API foi desenvolvida de modo que o log fosse gerado da forma mais inexpressível possível.
Para tanto, a API possui um mecanismo que define dinamicamente quais mensagens serão geradas, minimizando assim o impacto da operação durante a execução normal do sistema.

A API possui também interfaces e superclasses que permitem que o desenvolvendor extenda a mesma, podendo assim criar uma classe personalizada de log.

A API está no pacote java.util.logging e é constituída pelas seguintes classes e interfaces:

. ConsoleHandler
. FileHander
. Filter
. Formatter
. Handler
. Level
. Logger
. LoggingPermission
. LogManager
. LogRecord
. MemoryHandler
. SimpleFormatter
. SocketHandler
. StreamHandler
. XMLFormatter

Codificando

Agora vejamos um pequeno exemplo da utilização da API de logging:

O código abaixo criará um logger.

Desde que usemos um logger por classe, podemos manter um campo estático para nossa classe.
Utilizamos o nome completo da classe como nome do logger.

A API de log possui um arquivo de configuração ($JAVA_HOME/jre/lib/logging.properties) que por default fornece um mecanismo que enviará as mensagens no formato de LogRecord para o console(System.err).


package exemplo.logger;

import java.util.logging.Logger;

public class exemploLogger {
  private static Logger logador = Logger.getLogger(exemploLogger.class.getName());

  public static void main(String[] args) {
      exemploLogger ex = new exemploLogger("Mensagem no log");
      ex.gravaLog();
  }
  
  private String mensagem;
  
  public exemploLogger(String mensagem) {
      this.mensagem = mensagem;
  }
  
  public void gravaLog() {
      logador.finest(this.mensagem);
      System.err.println("Gravou no log:" +this.mensagem);
  }
}


Perceba que no código acima foi utilizado o método "finest" para gravar o log. Isso se deve ao nível de log implementado na aplicação. Perceba também que ao rodarmos a aplicação, será exibida somente a mensagem "Gravou no log: Mensagem no log". Isso deve-se ao nível de log que utilizamos na geração da mensagem. Veremos mais a frente uma explicação para isso.


Níveis de log

Veremos abaixo rapidamente os níveis de log disponíveis na API.
Podemos trabalhar com 7 níveis de log para definir a importância das mensagens.

São eles:

. SEVERE - O nível mais alto de log. Utilizado para mensagens extremamente importantes.
. WARNING - Mensagens de aviso.
. INFO - Para mensagens em tempo de execução.
. CONFIG - Mensagens de informação a respeito de configurações.
. FINE - Utilizado para detalhar a informação. Geralmente está presente em sessões de debug.
. FINER - O mesmo que FINE, porém mais detalhado.
. FINEST - O mesmo que FINE e FINER, porém com o nível mais alto de detalhamento dentre eles.

Além desses níveis, temos o nível "ALL", que habilita todos os níveis de log. Temos também o nível "OFF" que é usado para desativar o logging.

É possível também definir níveis personalizados, mas trataremos nesse artigo somente os níveis fornecidos pela API.

Algumas explicações

Agora podemos entender o motivo pelo qual nossa mensagem de log não apareceu quando executamos a aplicação. Utilizamos o método finest(), que gera um registro de log no nível Level.FINEST. Por default, somente registros com o nível Level.INFO ou maior serão enviados para o console.

Se quisermos fazer com que nossa mensagem apareça no console, devemos aumentar o nível de log como no exemplo abaixo:


package exemplo.logger;

import java.util.logging.Logger;

public class exemploLogger {
  private static Logger logador = Logger.getLogger(exemploLogger.class.getName());

  public static void main(String[] args) {
      exemploLogger ex = new exemploLogger("Mensagem no log");
      ex.gravaLog();
  }
  
  private String mensagem;
  
  public exemploLogger(String mensagem) {
      this.mensagem = mensagem;
  }
  
  public void gravaLog() {
      logador.info(this.mensagem);
      System.err.println("Gravou no log:" +this.mensagem);
  }
}

Agora, se rodarmos o programa, veremos uma saída como a seguinte:

INFO; 992149105222ms; 3207485;# 1; exemplo.logger.exemploLogger; gravaLog; Mensagem no log Gravou no log: Mensagem no log

Bom, pessoal. Ficamos por aqui essa semana. Um abraço e até a próxima.

Nenhum comentário até agora

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Christiano Pinheiro é desenvolvedor do iBanking da Caixa para Handhelds e diretor tecnológico da Systray.

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.