Desabilitar o Log4j no console do Tomcat e Jboss

0 respostas
D

E ai galera,

Estou com o seguinte problema.

Implementei uma classe de auditoria (AuditInterceptor) extendendo a classe EmptyInterceptor do Hibernate, que envia para um arquivo texto o resultado da auditoria.
Veja o código.

package br.com.util.persistencia;

import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ResourceBundle;

import org.apache.log4j.Appender;
import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.hibernate.EmptyInterceptor;
import org.hibernate.Transaction;
import org.hibernate.type.CustomType;
import org.hibernate.type.TimestampType;
import org.hibernate.type.Type;

import br.com.sys.entidade.Funcionario;
import br.com.util.entidade.Entidade;
import br.com.util.enumerador.EnumEntity;
import br.com.util.enumerador.EnumEntityStr;

public class AuditInterceptor extends EmptyInterceptor {
	private static Logger logger = Logger.getLogger(AuditInterceptor.class);

	private static final long serialVersionUID = 4428027000521375699L;

	private static final SimpleDateFormat fmtArquivo = new SimpleDateFormat("yyyy_MM_dd");
	private static final SimpleDateFormat fmtDataHora = new SimpleDateFormat("dd/MM/yy HH:mm:ss.SSS");
	private static final SimpleDateFormat fmtDataCampos = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

	private static final ResourceBundle bundle = ResourceBundle.getBundle("gestao");
	private static String diretorio;
	private static String separador;
	 
	private boolean gerarLog;
	private String msgLog;

	public AuditInterceptor() {
		diretorio = bundle.getString("audit.diretorio.log");
		separador = bundle.getString("audit.separador");

		String caminhoArquivo = diretorio + "/Infoges_Audit_" + fmtArquivo.format(new Date()) + ".log";
		
		Appender logAppender = null;
		
		try {
			PatternLayout pattern = new PatternLayout();
			pattern.setConversionPattern("%-2d{dd/MM/yy HH:mm:ss.SSS} - %m%n");

			logAppender = new DailyRollingFileAppender(pattern, caminhoArquivo, fmtArquivo.toPattern());

		} catch (IOException e) {}

		logger.addAppender(logAppender);
	}

	public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
		if (entity instanceof Entidade) {
			msgLog = montarRegistro("E", entity, state, propertyNames, types);
			gerarLog = Boolean.TRUE.booleanValue();
		}
	}

	public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState,
			String[] propertyNames, Type[] types) {

		if (entity instanceof Entidade) {
			for (int i = 0; i < propertyNames.length; i++) {
				if ("dataAlteracao".equals(propertyNames[i])) {
					currentState[i] = new Date();
					return true;
				}
			}

			msgLog = montarRegistro("AA", entity, previousState, propertyNames, types);
			msgLog += "\n" + fmtDataHora.format(new Date()).concat(" - ");
			msgLog += montarRegistro("AD", entity, currentState, propertyNames, types);

			gerarLog = Boolean.TRUE.booleanValue();
		}

		return false;
	}

	public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
		if (entity instanceof Entidade) {
			gerarLog = Boolean.FALSE.booleanValue();
		}

		return false;
	}

	public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
		if (entity instanceof Entidade) {
			for (int i = 0; i < propertyNames.length; i++) {
				if ("dataCriacao".equals(propertyNames[i])) {
					state[i] = new Date();
					return true;
				}
			}

			msgLog = montarRegistro("I", entity, state, propertyNames, types);
			gerarLog = Boolean.TRUE.booleanValue();
		}

		return false;
	}

	public void afterTransactionCompletion(Transaction tx) {
		if (tx.wasCommitted() && gerarLog) {

			logger.setLevel(Level.INFO);
			logger.info(msgLog);

			msgLog = "";
			gerarLog = Boolean.FALSE.booleanValue();
		}
	}

	private static void append(StringBuffer reg, String nomeAtributo, String valorAtributo) {
		if (nomeAtributo != null) {
			reg.append(nomeAtributo + separador);
		}

		reg.append(valorAtributo + separador);
	}

	private String montarRegistro(String tipo, Object entity, Object[] state, String[] propertyNames, Type[] types) {

		StringBuffer reg = new StringBuffer();
		String valorCampo = "";
		Funcionario usuario = (Funcionario) Sessions.getCurrent().getAttribute("usuarioLogado");

		// Entidade em questão
		append(reg, "Entidade", entity.getClass().getSimpleName());

		// Tipo da Operação (C-Consultar; I-Incluir; E-Excluir;
		// A-Alterar{Antes/Depois})
		append(reg, "Ação", tipo);

		append(reg, "Cod. Empresa", usuario.getId().getEEmpresa().getCodigo().toString());
		append(reg, "Empresa", usuario.getId().getEEmpresa().getNomeFantazia());
		append(reg, "Cod. Usuário", usuario.getId().getCodigo().toString());
		append(reg, "Usuário", usuario.getLogin());
		append(reg, "PK", ((Entidade) entity).toString());

		// Campos da entidade
		// reg.append(this.montarCampos(e));
		for (int i = 0; i < propertyNames.length; i++) {
			if (state[i] != null) {

				if (types[i] instanceof CustomType) {
					
					if (state[i] instanceof EnumEntity) {
						EnumEntity enumEntity = (EnumEntity) state[i];
						
						valorCampo = enumEntity.getId().toString();
						valorCampo += "-";
						valorCampo += enumEntity.getDescricao();
						
					} else if (state[i] instanceof EnumEntityStr) {
						EnumEntityStr enumEntity = (EnumEntityStr) state[i];
						
						valorCampo = enumEntity.getId();
						valorCampo += "-";
						valorCampo += enumEntity.getDescricao();
					}
					
				} else if (types[i] instanceof TimestampType) {
					valorCampo = fmtDataCampos.format(((Date) state[i]).getTime());

				} else {
					valorCampo = state[i].toString();
				}
			}

			append(reg, propertyNames[i], valorCampo.trim());
			valorCampo = "";
		}

		return reg.toString();
	}
}

Esse processo esta funciona muito bem, esta classe (AuditInterceptor) esta configurada no meu applicationContext.xml:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="entityInterceptor">
			<bean class="br.com.util.persistencia.AuditInterceptor"></bean>
		</property>
		...

O arquivo de log (log4j.properties) esta assim:

# - DEBUG - INFO - WARN - ERROR - FATAL
log4j.rootCategory=ERROR, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.logger.br.com.util.persistencia=ERROR

Mas mesmo com esta configuração ainda esta aparecendo no console do JBoss os dados da autitoria que é enviado para o arquivo texto de Log.

Ajuai-me irmãos, o chefe esta no meu pé?

Criado 16 de abril de 2010
Respostas 0
Participantes 1