quarta-feira, 15 de fevereiro de 2012

Criando um CustomAppender para JTextArea com Log4j

Recentemente estavámos trabalhando em um projeto de migração de dados em Java, e foi criada uma pequena interface para interagir com o usuário utilizando Swing. Em dado momento, decidimos incluir um JTextArea para mostrar ao usuário as informações emitidas pelo log do programa, no caso, utilizando Log4j, para que o mesmo pudesse acompanhar com mais detalhes o que o conversor estava fazendo no momento.

Foi então que pesquisando um pouco no google vimos que há como criar nossos próprios Appender's do Log4j, e é sobre isso que eu vou falar hoje.



Para criar um novo appender vamos estender a classe abstrata AppenderSkeleton, que já provê todas as funcionalidades básicas para tratamento da mensagem. São obrigatórios a implementação de 3 métodos:

close(): Utilizado para liberar os recursos alocados pelo appender como arquivos, conexões de rede, etc.
requiresLayout(): Indica se o appender necessita de um layout configurado para funcionar. Em casos onde o appender pode trabalhar com ou sem layout, o método deve retornar true;
append(LoggingEvent event): É o método principal que devemos implementar, é onde residirá o nosso tratamento customizado do log. Ele recebe um argumento do tipo LoggingEvent, que tem várias atributos como o Level da mensagem, a mensagem, a causa do erro em caso de exceções, etc.

Ok, agora vamos ver um pouco de código. Crie um projeto Maven e adicione as seguintes dependencias:


 log4j
 log4j
 1.2.16



 commons-lang
 commons-lang
 2.6


Em seguida crie uma classe chamada TextAreaAppender e implemente os métodos necessários.

public class TextAreaAppender extends AppenderSkeleton {
 
 //Outro métodos foram omitidos para simplificar o exemplo

 @Override
 protected void append(LoggingEvent event) {
  //formata a mensagem de acordo com o layout 
  String formatted = getLayout().format(event);

  jTextArea.append(formatted);

  // Se a mensagem possuí informações sobre a exceção que causou o erro
  if (event.getThrowableInformation() != null) {
   jTextArea.append(ExceptionUtils.getFullStackTrace(event
     .getThrowableInformation().getThrowable()));
  }
 }
}

Agora vou criar uma aplicação para exemplificar a configuração do Appender

public class Main extends JFrame {

 public static void main(String[] args) {
  Main main = new Main();

  main.init();
 }

 private void init() {
 
  textLogArea = new JTextArea();
 
     //Criação dos demais componentes visuais
  
  //Instancia o nosso Appender
  TextAreaAppender appender = new TextAreaAppender(textLogArea);

  //Adiciona o appender ao logger
  Logger.getRootLogger().addAppender(appender);

  logger.info("Log inicializado");
 }
}

O projeto completo está disponível no meu github.

Nenhum comentário:

Postar um comentário