{Resolvido}Como fazer log de Sistema

Boa Noite,

Pessoal gostaria de saber como fazer log do sistema ou seja gravar que usuario entro em tal horario,
o que ele fez no sistema se cadastro produto se excluio produto e por ai vai, alguém tem alguma ideia ???
bjosS…

“Ao escolher a opção remover”
“Realmente deseja remover? (SIM/NAO)”
“Sim: verificar banco de dados -> remover -> adicionar log ao banco de dados.”

Faça com que uma área do banco de dados tenha uma parte só de logs.

[quote=VA]“Ao escolher a opção remover”
“Realmente deseja remover? (SIM/NAO)”
“Sim: verificar banco de dados -> remover -> adicionar log ao banco de dados.”

Faça com que uma área do banco de dados tenha uma parte só de logs. [/quote]

Como faço isso ???

[quote=VA]“Ao escolher a opção remover”
“Realmente deseja remover? (SIM/NAO)”
“Sim: verificar banco de dados -> remover -> adicionar log ao banco de dados.”

Faça com que uma área do banco de dados tenha uma parte só de logs. [/quote]

Eu utilizo MySql

Você já utilizou o MySql para gravar alguma coisa?

Se sim: faça da mesma forma, apenas crie uma nova tabela utilizando agora apenas uma área para texto.

Se não: leia um pouco sobre insert/remove e o básico da ligação java -> mySql. Apos aprender a inserir qualquer informação no mySql você com certeza conseguirá fazer isso ai.

Obs.: não vou postar o código pq estou sem mySql aqui pra testar.

Talvez alguém possa dar para você um código pré-pronto ou informações melhores. Valeu :wink:

[quote=VA]Você já utilizou o MySql para gravar alguma coisa?

Se sim: faça da mesma forma, apenas crie uma nova tabela utilizando agora apenas uma área para texto.

Se não: leia um pouco sobre insert/remove e o básico da ligação java -> mySql. Apos aprender a inserir qualquer informação no mySql você com certeza conseguirá fazer isso ai.

Obs.: não vou postar o código pq estou sem mySql aqui pra testar.

Talvez alguém possa dar para você um código pré-pronto ou informações melhores. Valeu :wink:

[/quote]

Sim eu sei como inserir valores no banco, logar no banco agora queria saber como faz para fazer log do que os usuarios fazem no sistema e se possivel exibir um relatorio sobre isto,
e isto deixaria o banco mais lento ??

Você não insere informações como: nome do produto, valor do produto…

Você vai ter que dividir o banco de dados em partes.
produto: |nomeDoProduto|valor|…
usuario: |nomedoUsuario|usuario|senha…
log: |data|texto|

Verifique qual usuário está logado e insira informações ao log.

“Ao clickar no botão remover:”
“Verifique o usuário, me retorne o seu nome” (função de pesquisa mySql)
String text = “nomeDoUsuario” + “removeu alguma coisa”.
Insira o text no “texto” do log.

[quote=VA]Você não insere informações como: nome do produto, valor do produto…

Você vai ter que dividir o banco de dados em partes.
produto: |nomeDoProduto|valor|…
usuario: |nomedoUsuario|usuario|senha…
log: |data|texto|

Verifique qual usuário está logado e insira informações ao log.

“Ao clickar no botão remover:”
“Verifique o usuário, me retorne o seu nome” (função de pesquisa mySql)
String text = “nomeDoUsuario” + “removeu alguma coisa”.
Insira o text no “texto” do log.[/quote]

Por exemplo para deletar eu uso DELETE FROM PRODUTOS WHERE codigo = ?
como seria para eu memorizar o usuario e a data que fizeram isso no banco???

muitas formas de se fazer isso, vou falar uma conhecida:

Trigger no Banco de dados.

você cria tabelas espelho das suas tabelas ex:

Tabela LogChamado referênte a tabela Chamado.

no próprio banco de dados, você cria uma trigger que sempre que alguem -. Incluir / Alterar / Excluir algum registro da tabela, seu trigger é ativado e ele é responsável por gravar a mesma informação na tabela espelho.

alguns exemplos no MYSQL

[code]/* Trigger for INSERT */
CREATE TRIGGER HistoryTableInsert AFTER INSERT ON OriginalTable FOR EACH ROW BEGIN
DECLARE N DATETIME;
SET N = now();

INSERT INTO HistoryTable (Column1, Column2, …, Columnn, StartDate, EndDate)
VALUES (NEW.Column1, NEW.Column2, …, NEW.Columnn, N, NULL);
END;

/* Trigger for DELETE */
CREATE TRIGGER HistoryTableDelete AFTER DELETE ON OriginalTable FOR EACH ROW BEGIN
DECLARE N DATETIME;
SET N = now();

UPDATE HistoryTable
SET EndDate = N
WHERE Column1 = OLD.Column1
AND EndDate IS NULL;
END;

/* Trigger for UPDATE */
CREATE TRIGGER HistoryTableUpdate AFTER UPDATE ON OriginalTable FOR EACH ROW BEGIN
DECLARE N DATETIME;
SET N = now();

UPDATE HistoryTable
SET EndDate = N
WHERE Column1 = OLD.Column1
AND EndDate IS NULL;

INSERT INTO HistoryTable (Column1, Column2, …, Columnn, StartDate, EndDate)
VALUES (NEW.Column1, NEW.Column2, …, NEW.Columnn, N, NULL);
END;[/code]

Referência: http://en.wikipedia.org/wiki/Log_trigger

Se sua necessidade for meramente acadêmica, pra algum trabalho de faculdade ou parecido, implementar como foi sugerido do começo replicando a lógica de salvar o log em cada funcionalidade, é a maneira mais “direta” de fazer isso mesmo.

Mas se o objetivo for profissional, esses “cross-cutting concerns” como o log devem ser tratados de outras formas. Pode ser usado trigger, como foi dito acima. Ou se acabar sendo implementado na aplicação, talvez o melhor seja pensar em alguma forma de interceptor/aspecto para que a gravação do log seja “transparente” a programação das funcionalidades que se deseja logar. Resumindo, fazer com que a gravação do log seja “automática”, e não dependa da implementação direta das funcionalidades que estão sendo logadas.

Em tempos de JPA/Hibernate acredito que a estratégia mais comum seja criar um Listener ou Interceptor (eu particularmente gosto mais de usar triggers de banco).

Eu preciso do log para a area profissional levando em conta que tenho que chama eles depois no Ireport para exibir para o cliente para saber o que fez no sistema qual é o melhor caminho ???

o caminho mais conhecido, em várias linguagens é o trigger, eu faria por ele.

depois você cria uma classe para consultar os logs no banco…

[quote=rodrigo.uchoa]Se sua necessidade for meramente acadêmica, pra algum trabalho de faculdade ou parecido, implementar como foi sugerido do começo replicando a lógica de salvar o log em cada funcionalidade, é a maneira mais “direta” de fazer isso mesmo.

Mas se o objetivo for profissional, esses “cross-cutting concerns” como o log devem ser tratados de outras formas. Pode ser usado trigger, como foi dito acima. Ou se acabar sendo implementado na aplicação, talvez o melhor seja pensar em alguma forma de interceptor/aspecto para que a gravação do log seja “transparente” a programação das funcionalidades que se deseja logar. Resumindo, fazer com que a gravação do log seja “automática”, e não dependa da implementação direta das funcionalidades que estão sendo logadas.

Em tempos de JPA/Hibernate acredito que a estratégia mais comum seja criar um Listener ou Interceptor (eu particularmente gosto mais de usar triggers de banco).[/quote]

Mas pelo fato da Trigger ser uma maneira profissional,
sou obrigado a usar ela mesmo quando não compense em relação
a custo/benefício por dinheiro pago pelo sistema?

Já vi uns projetos desktop que fazem o log de eventos no sistema
chamando diretamente tipo uma tabela Auditoria
e gravando nela (usuário, data, hora, tela, função efetuada [cadastrar, salvar, alterar, excluir], e outros campos).

Abraço.

Resolvido obrigado Gente…!

[quote]Mas pelo fato da Trigger ser uma maneira profissional,
sou obrigado a usar ela mesmo quando não compense em relação
a custo/benefício por dinheiro pago pelo sistema?

Já vi uns projetos desktop que fazem o log de eventos no sistema
chamando diretamente tipo uma tabela Auditoria
e gravando nela (usuário, data, hora, tela, função efetuada [cadastrar, salvar, alterar, excluir], e outros campos). [/quote]

Você está certo sim. O que eu quis dizer na verdade era a solução que faz parte da “curva de normalidade das boas práticas”. No mundo imperfeito que nos vivemos, exceções devem ser aplicadas para quase tudo :slight_smile: