Utilizar datasource no log4j

Passei por um perrengue para descobrir como fazer o log ser persistido no banco de um jndi configurado.
Após passar por esse trabalho todo, do qual tive que ler várias documentações, pretendo descrever passo a passo esse processo que não é nada complicado.

Não quero descrever o uso do LOG4J ou sua finalidade, e sim ser compartilhar o uso de um novo appender do qual obtém uma conexão de banco de dados que foi configurado em seu servidor de aplicação.

Crie sua classe appender, pode ser conforme abaixo:

package br.com.rezende.log4j.appender;

import java.sql.Connection;
import java.sql.SQLException;
import javax.faces.context.FacesContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
import org.apache.log4j.jdbc.JDBCAppender;
import org.apache.log4j.spi.LoggingEvent;

public class MeuJDBCAppender extends JDBCAppender {

private static Logger LOGGER = Logger.getLogger(NGSAppender.class);
private DataSource dataSource;
private static String dataSourceJNDIName;
private static Context context;

/**
* Inicializa o contexto e o datasource.
*/
static {
   try {
    context = new InitialContext();
    dataSourceJNDIName = "jdbc/DS";
   }catch (NamingException e) {
    LOGGER.error(e.getMessage(), e);
   }
}

/**
* Obtém o nome do datasource configurado no Servidor de aplicações.
*
* @return Connection
*/
public Connection getConnection() throws SQLException {
 if (this.dataSource == null) {
  if (this.getDataSourceJNDIName() == null) {
  LOGGER.error("Nome do datasource está vazio.");
  return null;
 }
 try {
  this.dataSource = (DataSource) context.lookup(this
  .getDataSourceJNDIName());
 } catch (NamingException e) {
  LOGGER.error("Problema em obter o datasource");
  throw new SQLException(e);
 }
}
  try {
    return this.dataSource.getConnection();
  } catch (SQLException e) {
    LOGGER.error("Existe problema em obter um nome de datasource.");
    throw e;
  }
}

  public String getDataSourceJNDIName() {
    return dataSourceJNDIName;
  }

}

Mapeie na sua propriedade seu novo appender dentro do log4j.properties:


log4j.rootCategory=ERROR, JDBC, Console

# Console appender
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n
# JDBC Database
log4j.appender.JDBC = br.com.rezende.log4j.appender.MeuJDBCAppender
log4j.appender.JDBC.layout=org.apache.log4j.PatternLayout

Para inserir os valores em seu banco, visualize o próximo post, pois é necessário criar a tabela de log e formatar o seu INSERT para persistir a respectiva informação de stacktrace.

Abraços,
André Rezende

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s