LOG do que o Usuário fez no Sistema

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

LOG do que o Usuário fez no Sistema

Mensagem por fladimir »

Olá nobres colegas,

Venho até as mais brilhantes mentes de nossa nação, para solicitar:

- Dicas, Sugestões, Conselhos, Normas, Regras, Pormenores, Detalhes, enfim experiência para a seguinte questão:

Tenho um cliente em específico que esta alegando q "somem" as vendas do sistema, após troca de hd, remoção de vírus, desativação do recurso de Cache do XP, nobreaks, troca de switch, rede, implementação do uso de TS, não sobrou mais pra onde fugir, para nós ele esta usando uma função do sistema q é a Troca ou RecuperarDados, o mesmo alega q não nem seus funcionários...

... resumindo isto abriu precedente para eu implementar em meu sistema uma funcionalidade que a tempos pensei mas não fiz, a de GRAVAR um LOG do que o usuário fez, isto resolveria meu problema, pois iria trabalhar com fatos e não suposições do que ocorreu no cliente, se ele usou ou não determinada função.

Algum colega tem isto implementado? Poderia contribuir com o tópico compartilhando sua experiência... A princípio vou monitorar todas as chamadas de função que Apagam os dados no arquivo de venda para resolver este cliente, mas pretendo estender esta funcionalidade para todo o sistema.

Desde já, grato.

Sds.

Sucesso!!! :)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: LOG do que o Usuário fez no Sistema

Mensagem por rochinha »

Amiguinho,

Analise esta função e acrescente-a ao .PRG principal:

Código: Selecionar todos

FUNCTION dbCommitLog( LOG_TIPO, PROCNAME )
  LOCAL ret_line := "chr(13)+chr(10)", errfile  := "backup.log"
  IF     LOG_TIPO = 'A'
         M->MINHA_INFO    := 'ABERTURA'
  ELSEIF LOG_TIPO = 'I'
         M->MINHA_INFO    := 'INCLUSAO'
  ELSEIF LOG_TIPO = 'E'
         M->MINHA_INFO    := 'EXCLUSAO'
  ELSEIF LOG_TIPO = 'M'
         M->MINHA_INFO    := 'MANUTENCAO'
  ENDIF
  M->MODULO  := PROCNAME
  IF !FILE(errfile)
     errhandle = FCREATE(errfile)
     FWRITE(errhandle,"Segue lista de processos detectados."+&ret_line.+&ret_line.)
     FWRITE(errhandle,"Data     Hora     Operador             Processo"+&ret_line.)
     FWRITE(errhandle,replicate("-",80)+&ret_line.+&ret_line.)
  ELSE
     errhandle = FOPEN(errfile,1)
     length    = FSEEK(errhandle,0,2)
     FSEEK(errhandle,length)
  ENDIF                                                        
  FWRITE(errhandle,DTOC(DATE())+" "+TIME()+" "+M->OPERADOR+" "+M->MODULO+" "+M->MINHA_INFO+&ret_line.)
  FCLOSE(errhandle)
  RETURN(.T.)
Tenho pra mim que voce usa .CH sendo chamados para o seu sistema.

Se voce usa um .CH proprio, tipo FLADIMIR.CH, em todos os seus .PRGs então acrescente as seguintes linhas a eles e recompile todos os .PRGs:

Código: Selecionar todos

#command APPEND BLANK     => dbAppend( 0 ) ; dbCommitLog( 'I', PROCNAME() )
#command PACK             => __dbPack() ; dbCommitLog( 'E', PROCNAME() )
#command ZAP              => __dbZap()  ; dbCommitLog( 'E', PROCNAME() )
#command REGLOCK          => dbRegLock( 0 )    ; dbCommitLog( 'M', PROCNAME() )
#command REGLOCK <n>      => dbRegLock( <n> )  ; dbCommitLog( 'M', PROCNAME() )
#command FILELOCK         => dbFileLock( 0 )   ; dbCommitLog( 'M', PROCNAME() )
#command FILELOCK <n>     => dbFileLock( <n> ) ; dbCommitLog( 'M', PROCNAME() )
#command DELETE           => dbRegLock(0)      ; dbDelete() ; dbCommitLog('E', PROCNAME())
Teste e me diga se serve.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: LOG do que o Usuário fez no Sistema

Mensagem por fladimir »

Ok Rochinha, olhando rapidamente parece q atende melhor do q pensei, vou implementar e posto os resultados...
Só uma pequena dúvida...

Trabalho muito com:

Código: Selecionar todos

TabelaDBF->( DbDelete() )
A dúvida é se fazendo da maneira q exemplificou no Cabeçalho pegara tb? Bom vou testar e aviso depois se deu...


Outra coisa estive pensando em estender esta função colocando um parametro chamado cInfExtra
Pensei em criar esta variavel no inicio do programa como Publica e sempre q chamar a função de algum lugar alimentar o valor dela para gravar no Backup.Log com alguma Informação Extra e no final da função antes do Return fazer um
cInfExtra := " "

O que os colegas acham???

Grato e Sds.

Sucesso!!!
:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: LOG do que o Usuário fez no Sistema

Mensagem por fladimir »

Deu certo... obrigado Rochinha...

Agora uma dúvida eu fiz uma pequena alteração para pegar o nr. da linha e a tabela q foi modificada, mas não esta aparecendo certo...

Explico, numa venda tenho a tabela TEMP, Produtos, MovVenda, Vendas, Clientes e outras abertas, em uma determinada etapa q ocorre um:

Código: Selecionar todos

MovVenda->(DbDelete())
Ai no log mostra q foi na tabela TEMP (area corrente) mas foi na tabela MovVenda q estava aberta, mas não era a Area corrente, como proceder???

Abaixo o código do cabeçalho q manda a informação para a função dbCommitLog()

Código: Selecionar todos

#command APPEND BLANK  => dbAppend( 0 )     ; dbCommitLog( 'I', PROCNAME(), PROCLINE(), Alias(Select()) )
#command PACK          => __dbPack()        ; dbCommitLog( 'E', PROCNAME(), PROCLINE(), Alias(Select()) )
#command ZAP           => __dbZap()         ; dbCommitLog( 'E', PROCNAME(), PROCLINE(), Alias(Select()) )
#command REGLOCK       => dbRegLock( 0 )    ; dbCommitLog( 'M', PROCNAME(), PROCLINE(), Alias(Select()) )
#command REGLOCK <n>   => dbRegLock( <n> )  ; dbCommitLog( 'M', PROCNAME(), PROCLINE(), Alias(Select()) )
#command FILELOCK      => dbFileLock( 0 )   ; dbCommitLog( 'M', PROCNAME(), PROCLINE(), Alias(Select()) )
#command FILELOCK <n>  => dbFileLock( <n> ) ; dbCommitLog( 'M', PROCNAME(), PROCLINE(), Alias(Select()) )
#command DELETE        => dbRegLock(0)      ; dbDelete() ; dbCommitLog( 'E', PROCNAME(), PROCLINE(), Alias(Select()) )
Sds.

Sucesso!!! :)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Re: LOG do que o Usuário fez no Sistema

Mensagem por Stanis Luksys »

Olá,

Legal mesmo a função... Bem prática e simples de ser implementada. Acho que para ficar mais legal e incrementada, poderia usar uma criptografia simples antes de gravar no txt, e já que está usando xharbour, até mesmo compactar o txt.

Compactar exigiria muito tempo de cpu o que pode atrapalhar se o commit for realizado com muita frequência, e principalmente em muitos teminais. Mas dar um cript bem basicão seria legal, assim o cara não acha o nome dele pelo simples "pesquisar" do windows. Usuário é esperto!

Então você poderia criar um memoedit simples onde decripta e exibe o log ao mega master usuário.

Abraços!
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: LOG do que o Usuário fez no Sistema

Mensagem por fladimir »

Deu certo com a variavel Publica, crei no inicio do programa assim:

Código: Selecionar todos

Public cDBCommitLog := ' '
Ai depois na função dbCommitLog() na linha q grava o log coloco pra gravar a variavel acima.

Código: Selecionar todos

Function dbCommitLog(....)
....
  FWRITE(errhandle,DTOC(DATE())+" "+TIME()+" "+M->OPERADOR+" "+M->MODULO+" "+M->MINHA_INFO+ cDBCommitLog + &ret_line.)
...
Com isso em qualquer lugar do sistema q eu queira especificar melhor o log defino o conteudo da variavel exemplo:

Código: Selecionar todos

cDBCommitLog := "Usuario fez isso e akilo"
e antes do Return da Função dbCommitLog() cologo pra digamos assim zerar o conteudo dela assim:

Código: Selecionar todos

Function dbCommitLog(....)
....
 cDBCommitLog := ' '
Return
Stanis Luksys - Obrigado pela dica tb.

Vlw pessoal

Sds....
:-Y
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
clrod
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 17 Nov 2009 13:42
Localização: São Paulo - SP

Re: LOG do que o Usuário fez no Sistema

Mensagem por clrod »

Olá

Também vale à pena dar uma olhada nas funções nativas de LOG do [x]Harbour. Ainda não usei esse recurso mas parece que está bem estruturada e é algo padrão do sistema.

T+
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: LOG do que o Usuário fez no Sistema

Mensagem por fladimir »

Quais funções colega conhece pelo menos o nome de alguma ?

Sds.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: LOG do que o Usuário fez no Sistema

Mensagem por lugab »

Oi, pessoal...

Peguei carona nas idéias desse tópico, mas qdo vou compilar no meu xharbour 1.00 com a GTWIN (texto) + DBFCDX, sou avisado que me falta a função abaixo...

HB_FUN_DBREGLOCK

Ce podem me dizer Em qual lib essa função se encontra , caso seja realmente esse o problema ?

Grato,

Gabriel
lugab
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: LOG do que o Usuário fez no Sistema

Mensagem por fladimir »

coloca DBRLOCK

Sds.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
clrod
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 17 Nov 2009 13:42
Localização: São Paulo - SP

Re: LOG do que o Usuário fez no Sistema

Mensagem por clrod »

Olá

HB_InitStandardLog()
HB_OpenStandardLog()
HB_StandardLogAdd()
HB_SetStandardLogStyle()
HB_StandardLogName()
HB_BldLogMsg()
HB_LogDateStamp()

CLASS HB_Logger
CLASS HB_LogConsole FROM HB_LogChannel
CLASS HB_LogFile FROM HB_LogChannel
CLASS HB_LogDbf FROM HB_LogChannel
CLASS HB_LogSyslog FROM HB_LogChannel
CLASS HB_LogDebug FROM HB_LogChannel
CLASS HB_LogEmail FROM HB_LogChannel
CLASS HB_LogInetPort FROM HB_LogChannel


#xcommand INIT LOG [ON] ;
[<fil: FILE> ([<nFilPrio> [,<cFileName>[,<nFileSize>[,<nFileCount>]]]])] ;
[<con: CONSOLE> ([<nConPrio>])] ;
[<mon: MONITOR> ([<nMonPrio>[,<nMonPort>]])] ;
[<sys: SYSLOG> ([<nSysPrio>[,<nSysId>]])] ;
[<ema: EMAIL> ([<nEmaPrio> [,<cHelo>[,<cServer>[,<cDest>[,<cSubject>[,<cFrom>]]]]]])] ;
[<dbg: DEBUG> ( [<nDebugPrio> [,<nMaxDebugPrio>]] )] ;
[NAME <cName>]=>;
HB_InitStandardLog() ;;
if <.con.>;;
HB_StandardLogAdd( HB_LogConsole():New( <nConPrio> ));;
end ;;
if <.fil.> ;;
HB_StandardLogAdd( HB_LogFile():New( <nFilPrio>, <cFileName>, <nFileSize>, <nFileCount> ));;
end ;;
if <.mon.> ;;
HB_StandardLogAdd( HB_LogInetPort():New( <nMonPrio>, <nMonPort> ));;
end ;;
if <.sys.> ;;
HB_StandardLogAdd( HB_LogSyslog():New( <nSysPrio>, <nSysId> ));;
end ;;
if <.ema.> ;;
HB_StandardLogAdd( HB_LogEmail():New( <nEmaPrio> ,<cHelo>,<cServer>,<cDest>,<cSubject>,<cFrom>));;
end ;;
if <.dbg.> ;;
HB_StandardLogAdd( HB_LogDebug():New( <nDebugPrio>, <nMaxDebugPrio> ) ) ;;
end ;;
HB_StandardLogName( <cName> );;
HB_OpenStandardLog()


#xcommand SET LOG STYLE <nStyle> => HB_SetStandardLogStyle( <nStyle> )

#xcommand LOG <data,...> [PRIORITY <prio>] => ;
HB_StandardLog( HB_BldLogMsg( <data> ), <prio> )
#xcommand LOG <data,...> [PRIO <prio>] => ;
HB_StandardLog( HB_BldLogMsg( <data> ), <prio> )

#xcommand CLOSE LOG => HB_CloseStandardLog()

#xtranslate PRIO[RITY] DEFAULT => PRIO HB_LOG_DEFAULT
#xtranslate PRIO[RITY] CRITICAL => PRIO HB_LOG_CRITICAL
#xtranslate PRIO[RITY] ERROR => PRIO HB_LOG_ERROR
#xtranslate PRIO[RITY] WARNING => PRIO HB_LOG_WARNING
#xtranslate PRIO[RITY] WARN => PRIO HB_LOG_WARN
#xtranslate PRIO[RITY] INFO => PRIO HB_LOG_INFO
#xtranslate PRIO[RITY] DEBUG => PRIO HB_LOG_DEBUG

A lista não está completa.


T+
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: LOG do que o Usuário fez no Sistema

Mensagem por lugab »

Obrigado, Fladimir e Rochinha...

Gabriel
lugab
lapinhazzz
Usuário Nível 3
Usuário Nível 3
Mensagens: 130
Registrado em: 20 Abr 2009 10:52
Localização: LAGOA

Re: LOG do que o Usuário fez no Sistema

Mensagem por lapinhazzz »

Bom Dia a todos do Forum,

Estive a ver o código do log e não percebi nada.

Será que me podem postar a rotina final para incorporar nos meus programas.

Ainda sou um novato tenho 2 niveis de conhecimento.

Agradeço se for possivel postarem a rotina completa.

Obrigado.

Lapinhazzz
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: LOG do que o Usuário fez no Sistema

Mensagem por rochinha »

Amiguinho,

O forum não possui ferramentas nem pessoal para monitorar o nivel de conhecimento de seus usuários. Todos, sem excessão, que acessam este forum, seja para pesquisar, consultar ou dar consultoria são nivelados pelo montante de mensagens postadas ou respostas.

Quanto a sua necessidade, não ficou bem claro o que voce não entendeu, mas vou lhe explicar de forma rápida.

Em um pequeno programa de cadastramento onde figuram comandos como APPEND BLANK, REPLACE, DELETE, COMMIT, etc os sistemas se comportam normalmente pelos recursos da própria linguagem.

A idéia do código postado é acrescentar recurso sem fazer modificações no código.

Quando coloco:

Código: Selecionar todos

#command APPEND BLANK  => dbAppend( 0 )     ; dbCommitLog( 'I', PROCNAME(), PROCLINE(), Alias(Select()) )
Estou incrementando o comando original, lógico, desde que o programador use a sintaxe de comandos para sua codificação.

Para usuários como eu que costumam usar o método direto de acesso usando as funções, ai é necessário recodificar.

Exemplo conservador o que eu indico, principalmente para quem deseja aprender sem errar:

Código: Selecionar todos

USE clientes INDEX clientes SHARED NEW
...
APPEND BLANK
REPLACE campo WITH variavel
...
COMMIT
UNLOCK
No estilo de código acima se voce incluir as chamadas extendidas com controle de log a cada comando o log será assinado.

Programação avançada:

Código: Selecionar todos

dbUseArea( .T., , "clientes", , if(.T. .or. .F., !.F., NIL), .F.,  ) ; dbSetIndex( "clientes" )
...
dbAppend()
_FIELD->campo := variavel 
...
dbCommitAll()
dbUnlock()
No método acima voce precisa acrescentar os comandos manualmente e se não quiser usar deve excluir cada linha extra.

O método avançado não surte diferença nenhuma do rendimento do código ou da aplicação, portanto se voce esta começando a conhecer a linguagem use o método conservador e acrescente no inicio de cada .PRG as chamadas:

Código: Selecionar todos

#command APPEND BLANK  => dbAppend( 0 )     ; dbCommitLog( 'I', PROCNAME(), PROCLINE(), Alias(Select()) )
#command PACK          => __dbPack()        ; dbCommitLog( 'E', PROCNAME(), PROCLINE(), Alias(Select()) )
#command ZAP           => __dbZap()         ; dbCommitLog( 'E', PROCNAME(), PROCLINE(), Alias(Select()) )
#command REGLOCK       => dbRegLock( 0 )    ; dbCommitLog( 'M', PROCNAME(), PROCLINE(), Alias(Select()) )
#command REGLOCK    => dbRegLock(  )  ; dbCommitLog( 'M', PROCNAME(), PROCLINE(), Alias(Select()) )
#command FILELOCK      => dbFileLock( 0 )   ; dbCommitLog( 'M', PROCNAME(), PROCLINE(), Alias(Select()) )
#command FILELOCK   => dbFileLock(  ) ; dbCommitLog( 'M', PROCNAME(), PROCLINE(), Alias(Select()) )
#command DELETE        => dbRegLock(0)      ; dbDelete() ; dbCommitLog( 'E', PROCNAME(), PROCLINE(), Alias(Select()) )
Elas irão enganar o compilador acrescentando recursos fora do padrão.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
lapinhazzz
Usuário Nível 3
Usuário Nível 3
Mensagens: 130
Registrado em: 20 Abr 2009 10:52
Localização: LAGOA

Re: LOG do que o Usuário fez no Sistema

Mensagem por lapinhazzz »

Obrigado Rochinha

Lapinhazzz
Responder