Página 1 de 2
LOG do que o Usuário fez no Sistema
Enviado: 26 Ago 2010 13:14
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
Re: LOG do que o Usuário fez no Sistema
Enviado: 26 Ago 2010 14:19
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.
Re: LOG do que o Usuário fez no Sistema
Enviado: 26 Ago 2010 14:23
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:
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
Re: LOG do que o Usuário fez no Sistema
Enviado: 26 Ago 2010 17:18
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:
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
Re: LOG do que o Usuário fez no Sistema
Enviado: 26 Ago 2010 17:33
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!
Re: LOG do que o Usuário fez no Sistema
Enviado: 26 Ago 2010 18:21
por fladimir
Deu certo com a variavel Publica, crei no inicio do programa assim:
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:
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
Re: LOG do que o Usuário fez no Sistema
Enviado: 27 Ago 2010 23:14
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+
Re: LOG do que o Usuário fez no Sistema
Enviado: 28 Ago 2010 17:31
por fladimir
Quais funções colega conhece pelo menos o nome de alguma ?
Sds.
Re: LOG do que o Usuário fez no Sistema
Enviado: 28 Ago 2010 17:46
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
Re: LOG do que o Usuário fez no Sistema
Enviado: 28 Ago 2010 19:00
por fladimir
coloca DBRLOCK
Sds.
Re: LOG do que o Usuário fez no Sistema
Enviado: 28 Ago 2010 19:32
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+
Re: LOG do que o Usuário fez no Sistema
Enviado: 28 Ago 2010 23:09
por lugab
Obrigado, Fladimir e Rochinha...
Gabriel
Re: LOG do que o Usuário fez no Sistema
Enviado: 07 Set 2010 11:15
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
Re: LOG do que o Usuário fez no Sistema
Enviado: 07 Set 2010 12:55
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.
Re: LOG do que o Usuário fez no Sistema
Enviado: 07 Set 2010 14:10
por lapinhazzz
Obrigado Rochinha
Lapinhazzz