Como vocês costumam fazer o log para auditoria de uma aplicação? Por exemplo para saber qual usuário fez a operação x no dia y? Considerando em se tratar um aplicação web com um pool de conexões com um usuário único?
Estou usando o log4j logando as execuções do métodos de negócio para um arquivo, mas não acho que seja uma forma legal de se fazer isso.
Eu faço quase a mesma coisa, mas gravo em banco de dados.
Como eu uso struts dividindo as funcionalidades em modulos, eu posso pela URL pegar(no filtro) qual funcionalidade o usuario esta acessando, com essa associação de URL x Funcionalidade x Usuario logado eu consigo rastrear quem fez o que.
A aplicação fazer sua própria auditoria é algo que funciona para situações menos formais.
O problema conceitual é que a auditoria deveria, em princípio, usar um mecanismo independente da aplicação uma vez que não se pode partir do princípio que o código é confiável (intencional ou não incencionalmente).
Recentemente participei de um projeto deste tipo, e a melhor solução encontrada foi combinar um analisador de rede, para capturar as queries indo para o banco, em conjunto com um agente na JVM implementado com o uso do AspectWerkz para injetar informações complementares tais como a URL acessada, usuário autenticado e IP remoto.
[quote=psevestre]A aplicação fazer sua própria auditoria é algo que funciona para situações menos formais.
[/quote]
Eu também acho isso. Normalmente utilizávamos mecanismos do próprio banco de dados para auditoria, mas utilizando um pool de conexões isso não adianta muito. A não ser que se fizesse uma “gambiarra” de colocar o usuário logado em todas as tabelas do banco, o que eu também não gostaria de fazer.
[quote=mutano][quote=psevestre]A aplicação fazer sua própria auditoria é algo que funciona para situações menos formais.
[/quote]
Eu também acho isso. Normalmente utilizávamos mecanismos do próprio banco de dados para auditoria, mas utilizando um pool de conexões isso não adianta muito. A não ser que se fizesse uma “gambiarra” de colocar o usuário logado em todas as tabelas do banco, o que eu também não gostaria de fazer.[/quote]
Mesmo os mecanismos do banco devem ser considerado suspeitos, pois vc. não pode confiar no DBA - ao menos não do ponto de vista de um auditor.
Para o caso do pool, o esquema do agente funciona em sintonia com o mecanismo de teste de conexão que está presente na maioria dos de servidores de aplicação. O agente intercepta o código que vai executar a query e injeta o usuário corrente. Desta forma, o trace da conexão, mantido no apliance que faz a captura dos pacotes na rede, passa a ter uma query “marcadora” indicando o início de acessos por determinado usuário.
Ainda a respeito do log vocês acham conveniente que se jogue isso num arquivo com o log4j, já considerando que fosse um mecanismo separado da aplicação e do bd? Isso não poderia acarretar uma perda de performance do app. server?
Pode e acarreta, dependendo das informações que vc. decidir logar.
Conheço produtos especializados em log de banco de dados, que funcionam como um “sniffer” de rede, capturando pacotes do tráfego entre o AppServer e/ou clientes do tipo SQLPlus e armazenando tudo em um apliance externo.