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é?