VRaptor 3.1, @Intecepts, Log de auditoria

3 respostas
D

Alguma idéia de como eu posso estar utilizando o @Intercepts do vraptor para estar fazendo um log de auditoria?

O log teria as informações, do valor antigo do parametro, o valor alterado, data de alteração e usuario que alterou.

Sugestões?, Dicas?

3 Respostas

G

Você usa hibernate? Se sim você nunca conseguirá isso no vraptor.

Se você tem um objeto X que você alterou, e se você quiser tentar buscar o objeto antigo a menos que você pegue uma stateless-session você sempre pegará o valor corrente do pojo já alterado. Sendo assim eles serão sempre iguais.

A melhor solução, que é a que eu uso em um grande projeto que tenho e que precisa de uma minusciosa auditoria é usar o hibernate envers, que se não me engano já está vindo no core do hibernate (antigamente era um projeto da jboss).

Faça uma pesquisa sobre ele. É bem simples de configurar bastando apenas adicionar os listeners. Ele mesmo cria as tabelas de audit e faz todo esse controle. No caso desse meu sistema implementei uma forma de você comprar cada versão do registro, fazer merge ou rollback de versões.

Paulo_Silveira

Oi Davi!

Voce pode usar o hibernate (o plugin envers) como o Garcia sugeriu, se voce esta se importando com o conteudo de linhas do banco.

Caso queira auditar acessos a URLs, pode fazer algo que logue o usuario, o ip, e parametros caso voce precise.:

@Intercepts
public class AuditoriaInterceptor implements Interceptor {

	private static final Logger LOG = Logger.getLogger(AuditoriaInterceptor.class);
	private final UserInfo info;
	private final HttpServletRequest request;

	public AuditoriaInterceptor(UserInfo info, HttpServletRequest request) {
		this.info = info;
		this.request = request;
	}

	@Override
	public boolean accepts(ResourceMethod method) {
		return method.containsAnnotation(Audit.class);
	}

	@Override
	public void intercept(InterceptorStack stack, ResourceMethod method, Object object) throws InterceptionException {
		LOG.info(method.toString());
		LOG.info("usuário: " + info.getUser());
		LOG.info("ip: " + request.getRemoteAddr() + " " + request.getRemoteHost()+ 
                        " from " + request.getHeader( "X_FORWARDED_FOR" ));
		Audit audit = method.getMethod().getAnnotation(Audit.class);
		for (String value : audit.value()) {
			LOG.info(value + "->" + request.getParameter(value));
		}
		LOG.info("");
		stack.next(method, object);
	}
}

Depois basta criar essa anotacoes e anotar com @Audit as classes que voce queria que sejam logadas por esse log:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Audit {
	String[] value() default {};
}
D

Obrigado pela dica pessoal, estou usando hibernate, e vou dar uma estudada no Envers, qualquer duvida volto aqui.

Criado 3 de fevereiro de 2010
Ultima resposta 3 de fev. de 2010
Respostas 3
Participantes 3