Trilha de auditoria em java

Como foi dito aqui, a melhor solução é tratar isso a nível de branco de dados.
Onde trabalho, temos uma tabela de log onde registra toda e qualquer INSERÇÃO, ATUALIZAÇÃO E DELEÇÃO de dados. Tudo é feito por trigger/procedures/functions. Como foi passado ali em cima, se alguém de FORA da aplicação acessar, fica fácil furar esse “log” e mexer nas tabelas sem que isso fosse gravado em algum lugar.