Sistema de Auditoria, alguém conhece?

14 respostas
AUser

Boa tarde srs.,

Bom, estou na busca de arrancar umas tabelas de log que tenho no meu sistema (UserLog, etc). Para isso, estou buscando uma solução elegante e simples para isso.

Como eu gostaria que funcionasse:

  1. Ao executar determinada ação, insere no sistema o determinado tipo de log (forneceria por ex, a String da entidade (“user”), e a ação (“user sent an email”). Ou entao, um objeto por JSON, ou algo do gênero.

  2. O sistema fornece estruturas para que eu possa interpretar esse log de alguma maneira (gerar relatórios, consultas, etc).

O importante é que haja a simplicidade na coisa, eu só quero operações básicas e quero ter o mínimo de dor de cabeça com isso. Tal como o deploy ser simples e rápido, nada daqueles deploys mega ultra-blaster estilo WebSphere, hehe. :stuck_out_tongue:

Alguém conhece algumas soluções?

Grato!

14 Respostas

bruno.costa

Dê uma olhada no envers.

http://www.jboss.org/envers

AUser

Opa Bruno,

Muito obrigado pelo link. Só uma coisa que para mim não ficou claro: exemplo, quero logar o seguinte texto, “Usuário fez login”. Eu não entendi como isso funciona ali no Envers. Nem no tutorial ficou muito claro isso…

Obrigado.

Alexandre_Saudate

AUser:
Opa Bruno,

Muito obrigado pelo link. Só uma coisa que para mim não ficou claro: exemplo, quero logar o seguinte texto, “Usuário fez login”. Eu não entendi como isso funciona ali no Envers. Nem no tutorial ficou muito claro isso…

Obrigado.

O Envers não vai servir mesmo para esse tipo de funcionalidade. O Envers é um conjunto de listeners Hibernate especializados em fazer persistência em tabelas de log. Por exemplo, se você alterar um determinado campo de uma tabela via Hibernate, o Envers vai interceptar isso e vai persistir numa tabela à parte a alteração feita.

Para você complementar esse tipo de funcionalidade, você poderia usar AspectJ + Log4J, por exemplo (ou só o Log4J, se for uma auditoria simples). Ou, ainda, você poderia escrever seu próprio listener Hibernate.

[]'s

bruno.costa
AUser:
Opa Bruno,

Muito obrigado pelo link. Só uma coisa que para mim não ficou claro: exemplo, quero logar o seguinte texto, "Usuário fez login". Eu não entendi como isso funciona ali no Envers. Nem no tutorial ficou muito claro isso...

Obrigado.

Você quer fazer log das operações ou auditoria?

Explique o porque logar "Usuario fez login" (ou isso foi um mero exemplo?)

Mas veja se isto ajuda..
@Entity
@RevisionEntity(AuditListener.class)
public class AuditRevision {

	@Id
	@GeneratedValue
	@RevisionNumber
	private Long id;

	@RevisionTimestamp
	private long timestamp;

	private Long userId;

        private String textoParaLogar; 

       // getters e setters.
}
Entidade Listener
public class AuditListener implements RevisionListener {

	@Override
	public void newRevision(Object revisionEntity) {
		AuditRevision audityRevision = (AuditRevision) revisionEntity;

		
		audityRevision.setTextoParaLogar("Usuario fez login");
		
	}
}

Uma forma de recuperar um objeto ai nesta AuditListener é usando o TransactionSynchronizationManager do spring

AUser

Opa asaudate,

Tô lendo aqui. E se eu criasse um RevisionListener com os campos (userLogin (já que é UK), action (“fez login”). Você não acha que teria como?

Eu nao acho que com o AspectJ + Log4J seria uma solução elegante para o caso de auditoria de usuário. Exemplo, o usuário modificou um parâmetro X do sistema, e nesse ponto deve haver log. Eu não queria ter que ter uma tabela UserLog pra isso, eu gostaria de ter algo como (entity=“param”, userLogin=“auser”, action=“Modificou parametro”, value=“novovalor”), algo assim… Eu não sei se estou sendo bem claro.

Grato!

AUser
bruno.costa:
AUser:
Opa Bruno,

Muito obrigado pelo link. Só uma coisa que para mim não ficou claro: exemplo, quero logar o seguinte texto, "Usuário fez login". Eu não entendi como isso funciona ali no Envers. Nem no tutorial ficou muito claro isso...

Obrigado.

Você quer fazer log das operações ou auditoria?

Explique o porque logar "Usuario fez login" (ou isso foi um mero exemplo?)

Mas veja se isto ajuda..
@Entity
@RevisionEntity(AuditListener.class)
public class AuditRevision {

	@Id
	@GeneratedValue
	@RevisionNumber
	private Long id;

	@RevisionTimestamp
	private long timestamp;

	private Long userId;

        private String textoParaLogar; 

       // getters e setters.
}
Entidade Listener
public class AuditListener implements RevisionListener {

	@Override
	public void newRevision(Object revisionEntity) {
		AuditRevision audityRevision = (AuditRevision) revisionEntity;

		
		audityRevision.setTextoParaLogar("Usuario fez login");
		
	}
}

Uma forma de recuperar um objeto ai nesta AuditListener é usando o TransactionSynchronizationManager do spring

Opa Bruno,

No caso do porquê logar algo como "usuário fez login", muitos clientes maiores (bancos) exigem um certo nível de log beeem nesse estilo. Eu gostaria de fazer o log das ações, e poder auditar.

Muito obrigado pela resposta. É mais ou menos isso mesmo que estou procurando. Quando eu testar e se conseguir alguma nova dúvida, posto por cá. Obrigado! :)

AUser

Rapaz, pra ser sincero acho que eu entendi errado. Desse jeito, ele só iria criar o Audit quando o usuário fosse alterado, certo? Ok, eu entendi errado mesmo. Eu quero logar as ações, e poder realizar a auditoria em cima delas mesmo…

bruno.costa

por isso eu perguntei a sua intenção… para fazer log mesmo, você pode utilizar AspectJ…

AUser

Pois é, mas olha só o caso:

Tenho uma tabela User, e uma UserLog, toda vez que ocorre uma determinada ação no sistema, é inserido um registro nessa userLog (efetuou login, alterou permissões, etc). O problema disso é que não considero uma abordagem muito prática, visto que o software não é um repositório de logs e essa parte de auditoria, eu gostaria que ficasse de fora do sistema (literalmente arrancar essa tabela de userLog). A necessidade prática é essa, agora o log4j + aspect4j também não me atende, pois não é legal logar desse jeito quando tenho 5k de usuários, por ex. Como vou salvar os logs? Em txts separados? Não me parece mto convicente…

É numa solução dessas que estou atrás.

[]'s

Alexandre_Saudate

AUser:
Pois é, mas olha só o caso:

Tenho uma tabela User, e uma UserLog, toda vez que ocorre uma determinada ação no sistema, é inserido um registro nessa userLog (efetuou login, alterou permissões, etc). O problema disso é que não considero uma abordagem muito prática, visto que o software não é um repositório de logs e essa parte de auditoria, eu gostaria que ficasse de fora do sistema (literalmente arrancar essa tabela de userLog). A necessidade prática é essa, agora o log4j + aspect4j também não me atende, pois não é legal logar desse jeito quando tenho 5k de usuários, por ex. Como vou salvar os logs? Em txts separados? Não me parece mto convicente…

É numa solução dessas que estou atrás.

[]'s

Você pode usar só o AspectJ, então, e salvar o usuário em banco. OU até criar um appender customizado pro Log4J, visto que o pessoal de operações ia te agradecer muito, mas muito MESMO, se você fizesse isso, já que eles iam poder configurar de fora se eles querem persistir as mensagens de log, salvar em arquivo, mandar pra um SAN, etc.

[]'s

AUser

asaudate:
AUser:
Pois é, mas olha só o caso:

Tenho uma tabela User, e uma UserLog, toda vez que ocorre uma determinada ação no sistema, é inserido um registro nessa userLog (efetuou login, alterou permissões, etc). O problema disso é que não considero uma abordagem muito prática, visto que o software não é um repositório de logs e essa parte de auditoria, eu gostaria que ficasse de fora do sistema (literalmente arrancar essa tabela de userLog). A necessidade prática é essa, agora o log4j + aspect4j também não me atende, pois não é legal logar desse jeito quando tenho 5k de usuários, por ex. Como vou salvar os logs? Em txts separados? Não me parece mto convicente…

É numa solução dessas que estou atrás.

[]'s

Você pode usar só o AspectJ, então, e salvar o usuário em banco. OU até criar um appender customizado pro Log4J, visto que o pessoal de operações ia te agradecer muito, mas muito MESMO, se você fizesse isso, já que eles iam poder configurar de fora se eles querem persistir as mensagens de log, salvar em arquivo, mandar pra um SAN, etc.

[]'s

Opa ASaudate,

Obrigado pela resposta. A questão é que ando receioso a tudo isso. Por exemplo, eu ando avaliando realmente se existe essa questão de persistir o usuário no mesmo banco de dados do sistema. Isso tudo pra mim, é coisa separada que não faz parte do sistema. E essa parte de log também tem me incomodado muito. Vc tem algum paper sobre isso?

obrigado

Alexandre_Saudate

AUser:
asaudate:
AUser:
Pois é, mas olha só o caso:

Tenho uma tabela User, e uma UserLog, toda vez que ocorre uma determinada ação no sistema, é inserido um registro nessa userLog (efetuou login, alterou permissões, etc). O problema disso é que não considero uma abordagem muito prática, visto que o software não é um repositório de logs e essa parte de auditoria, eu gostaria que ficasse de fora do sistema (literalmente arrancar essa tabela de userLog). A necessidade prática é essa, agora o log4j + aspect4j também não me atende, pois não é legal logar desse jeito quando tenho 5k de usuários, por ex. Como vou salvar os logs? Em txts separados? Não me parece mto convicente…

É numa solução dessas que estou atrás.

[]'s

Você pode usar só o AspectJ, então, e salvar o usuário em banco. OU até criar um appender customizado pro Log4J, visto que o pessoal de operações ia te agradecer muito, mas muito MESMO, se você fizesse isso, já que eles iam poder configurar de fora se eles querem persistir as mensagens de log, salvar em arquivo, mandar pra um SAN, etc.

[]'s

Opa ASaudate,

Obrigado pela resposta. A questão é que ando receioso a tudo isso. Por exemplo, eu ando avaliando realmente se existe essa questão de persistir o usuário no mesmo banco de dados do sistema. Isso tudo pra mim, é coisa separada que não faz parte do sistema. E essa parte de log também tem me incomodado muito. Vc tem algum paper sobre isso?

obrigado

Não, não tenho nenhum paper a respeito… mas acho que você está certo em considerar a questão, já que o usuário pode vir de diversas fontes (AD, BD, SSO… ) e, de fato, não fazer parte do sistema. Mas o ponto a ser considerado é que ele deve ser referenciado de alguma maneira. Assim, o melhor que pode ser feito a esta questão é você possuir, no seu sistema, um campo varchar, sem FK especificada, para referenciar um usuário. Desculpe não poder ajudar mais nesta questão.

Quanto à questão dos logs, li num livro (Release It! - recomendo muitíssimo) que o melhor que se pode fazer é deixar configurável. Nunca se sabe que espécie de questão o pessoal de operações pode ter que enfrentar, então, o melhor a ser feito é deixar certas decisões nas mãos deles. Na verdade, o livro defendia que não só o sistema de logs deveria ser configurável por fora, mas todo o sistema. Isso inclui pools de threads, comunicação remota, classes a serem usadas em determinados trechos, etc. Notei, inclusive, que o livro não menciona nunca, mas está presente sempre, o Spring - já que ele permite que se faça esse tipo de configuração externa.

[]'s

AUser

asaudate:
AUser:
asaudate:
AUser:
Pois é, mas olha só o caso:

Tenho uma tabela User, e uma UserLog, toda vez que ocorre uma determinada ação no sistema, é inserido um registro nessa userLog (efetuou login, alterou permissões, etc). O problema disso é que não considero uma abordagem muito prática, visto que o software não é um repositório de logs e essa parte de auditoria, eu gostaria que ficasse de fora do sistema (literalmente arrancar essa tabela de userLog). A necessidade prática é essa, agora o log4j + aspect4j também não me atende, pois não é legal logar desse jeito quando tenho 5k de usuários, por ex. Como vou salvar os logs? Em txts separados? Não me parece mto convicente…

É numa solução dessas que estou atrás.

[]'s

Você pode usar só o AspectJ, então, e salvar o usuário em banco. OU até criar um appender customizado pro Log4J, visto que o pessoal de operações ia te agradecer muito, mas muito MESMO, se você fizesse isso, já que eles iam poder configurar de fora se eles querem persistir as mensagens de log, salvar em arquivo, mandar pra um SAN, etc.

[]'s

Opa ASaudate,

Obrigado pela resposta. A questão é que ando receioso a tudo isso. Por exemplo, eu ando avaliando realmente se existe essa questão de persistir o usuário no mesmo banco de dados do sistema. Isso tudo pra mim, é coisa separada que não faz parte do sistema. E essa parte de log também tem me incomodado muito. Vc tem algum paper sobre isso?

obrigado

Não, não tenho nenhum paper a respeito… mas acho que você está certo em considerar a questão, já que o usuário pode vir de diversas fontes (AD, BD, SSO… ) e, de fato, não fazer parte do sistema. Mas o ponto a ser considerado é que ele deve ser referenciado de alguma maneira. Assim, o melhor que pode ser feito a esta questão é você possuir, no seu sistema, um campo varchar, sem FK especificada, para referenciar um usuário. Desculpe não poder ajudar mais nesta questão.

Quanto à questão dos logs, li num livro (Release It! - recomendo muitíssimo) que o melhor que se pode fazer é deixar configurável. Nunca se sabe que espécie de questão o pessoal de operações pode ter que enfrentar, então, o melhor a ser feito é deixar certas decisões nas mãos deles. Na verdade, o livro defendia que não só o sistema de logs deveria ser configurável por fora, mas todo o sistema. Isso inclui pools de threads, comunicação remota, classes a serem usadas em determinados trechos, etc. Notei, inclusive, que o livro não menciona nunca, mas está presente sempre, o Spring - já que ele permite que se faça esse tipo de configuração externa.

[]'s

Nunca tinha ouvido falar nesse livro, vou dar um olhada. Outra coisa, sobre essa questão de users também, eu já tinha olhado e esbarrei justamente nessa parte de log e em como ia relacionar as FKs, pra isso tinha pensado em usar o openAM. Mas os relacionamentos que me quebraram as pernas. Pra mim é meio absurdo ter essa idéia de armazenar usuários e logs de acordo com as políticas do meu sistema, até pq, olha o tamanho do retrabalho que há… Quantas mil apps já reinevntaram a roda.

Bom, é isso. Vou pesquisando aqui pra ver se acho mais alguma coisa. Se vc souber algo de log nesse nível que possa me ajudar, vou ficar muito grato. :slight_smile:

Obrigado!

AUser

Galera, alguém conhece isso?

http://audit.qos.ch/manual/Running_the_Server.html

Criado 5 de setembro de 2011
Ultima resposta 5 de set. de 2011
Respostas 14
Participantes 3