Jump to content
Fivewin Brasil

Gravar log de acesso ao Sistema


Geraldo (gbsilva)

Recommended Posts

Pessoal gostaria da opinião de voces sobre como voces registram qual usuário gravou, modificou ou excluiu um determinado registro.

Voces tem outra tabela ou dbf que voces gravam ou um arquivo texto etc.

Estou em dúvidas num sistema e preciso de algumas dicas.

Grato,

Geraldo B. Silva

FWH 2.6 Junho/2005, xHarbour 0.99.50 (Simplex), Bcc55, Pelles, xDev, MyMake, Sqllib e MySql.

lucgera@terra.com.br

São Paulo - SP

Link to comment
Share on other sites

Pessoal gostaria da opinião de voces sobre como voces registram qual usuário gravou, modificou ou excluiu um determinado registro.

Voces tem outra tabela ou dbf que voces gravam ou um arquivo texto etc.

Estou em dúvidas num sistema e preciso de algumas dicas.

Grato,

Geraldo B. Silva

FWH 2.6 Junho/2005, xHarbour 0.99.50 (Simplex), Bcc55, Pelles, xDev, MyMake, Sqllib e MySql.

lucgera@terra.com.br

São Paulo - SP

Link to comment
Share on other sites

Eu faço assim:


FUNCTION SuaFuncao()

nOper := 1

cOper := "Nome do operador

// Execusa seus comandos, e:

LogReg(nOper,cOper,"Executou determinada tarefa")

RETURN NIL

**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**

FUNCTION LogReg(nOperad,cOperad,cAction)

LOCAL OldLogDb, aStr, cDbfInfo

IF nOperad = 0

RETURN NIL

ENDIF

PUBLIC nErros, lGoOn

OldLogDb := SELECT()

cDbfInfo := ""

nErros := 0

cDbLog := "LOG"+STRZERO(nOperad,5)

aStr := {}

AADD( aStr, {"DATA", "D", 10, 00})

AADD( aStr, {"HORA", "C", 05, 00})

AADD( aStr, {"ACAO", "C",1024, 00})

AADD( aStr, {"CODIGO", "N", 04, 00})

AADD( aStr, {"NOME", "C", 45, 00})

cDbfInfo += CheckDbf(aStr, cDbLog, .T.)

IF ! FILE(cDbLog+".DBF")

DBCREATE(cDbLog+".DBF", aStr)

ENDIF

IF nErros > 0

cDbfInfo := MEMOREAD("STRERRO.TXT")

MsgAlert("Existem erros no arquivo "+cDBase+".DBF"+CRLF+CRLF+cDbfInfo+CRLF+CRLF+"Favor corrigir antes de prosseguir.","Erro de estrutura")

SELECT(mDb)

RELEASE nErros, lGoOn

RETURN aPadrao

ENDIF

USE &(cDbLog) SHARED NEW

SelFile := SELECT()

LogFile := (SelFile)->(ALIAS())

WHILE ! &(LogFile)->(RLOCK()) ; ERROREDE() ; END

&(LogFile)->(DBAPPEND())

REPLACE &(LogFile)->DATA WITH DATE()

REPLACE &(LogFile)->HORA WITH LEFT(TIME(),5)

REPLACE &(LogFile)->ACAO WITH cAction

REPLACE &(LogFile)->CODIGO WITH nOperad

REPLACE &(LogFile)->NOME WITH cOperad

&(LogFile)->(DBCLOSEAREA())

SELECT(OldLogDb)

RELEASE nErros, lGoOn

RETURN NIL

**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**

STATIC FUNCTION FiltraLog(dDat,oLogBrw)

IF ! EMPTY(DTOS(dDat))

SET FILTER TO DATA = dDat

ELSE

SET FILTER TO

ENDIF

oLogBrw:GoBottom()

oLogBrw:UpStable()

oLogBrw:Refresh()

RETURN .T.

**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**

STATIC FUNCTION ImpLog(oLogBrw)

LOCAL oPrn, oFont, nPag, mLarg, nWidt, nSpc, nRow, nCls

PRINTER oPrn TO cVndImp NAME OemToAnsi("Log do operador") PREVIEW

DEFINE FONT oFont NAME "Arial" SIZE 0, -10 OF oPrn

DEFINE FONT oFon2 NAME "Courier New" SIZE 0, -10 OF oPrn

nPag := 1

nTab := oPrn:nHorzRes()/20

mLarg := oFont:nHeight

nWidt := oFont:nWidth*10

nSpc := (oPrn:nHorzRes()-(2*nTab)) / 90

nRow := 4

nCls := {nTab+(nSpc*01),;

nTab+(nSpc*11),;

nTab+(nSpc*19) }

nCent := nTab+(nSpc*48)

oPrn:StartPage()

FOR Y := 1 TO 90

oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont)

NEXT

nRow++

oPrn:Say(nRow*mLarg, nCent, oRaz, oFont, , , ,2)

nRow++

oPrn:Say(nRow*mLarg, nCent, mEnd+", N. "+mNmr+" - "+mBro, oFont, , , ,2)

nRow++

oPrn:Say(nRow*mLarg, nCent, mCid, oFont, , , ,2)

nRow++

oPrn:Say(nRow*mLarg, nCent, mFon, oFont, , , ,2)

nRow+=2

FOR Y := 1 TO 90

oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont)

NEXT

nRow++

oPrn:Say(nRow*mLarg, nCls[1], OemToAnsi("RELATàRIO DE ATIVIDADES"), oFont)

nRow++

oPrn:Say(nRow*mLarg, nCls[1], "OPERADOR: "+STRZERO(CODIGO,2)+"-"+ALLTRIM(NOME), oFont)

nRow+=2

oPrn:Say( nRow*mLarg, nCls[1], OemToAnsi("DATA"), oFont )

oPrn:Say( nRow*mLarg, nCls[2], OemToAnsi("HORA"), oFont )

oPrn:Say( nRow*mLarg, nCls[3], OemToAnsi("ACAO"), oFont )

nRow+=2

FOR Y := 1 TO 90

oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont)

NEXT

nRow ++

DbGotop()

WHILE ! EOF()

oPrn:Say( nRow*mLarg, nCls[1], DTOC(DATA), oFont )

oPrn:Say( nRow*mLarg, nCls[2], HORA, oFont )

cTxt := RTRIM(ACAO)

mTtL1:= MLCOUNT(cTxt,70)

IF mTtL1 > 1

FOR Y := 1 TO mTtL1-1

oPrn:Say(nRow*mLarg, nCls[3], JUSTIFICA(cTxt,70,Y), oFon2)

nRow++

NEXT

oPrn:Say(nRow*mLarg, nCls[3],MEMOLINE(cTxt,70,mTtL1), oFon2)

ELSE

oPrn:Say(nRow*mLarg, nCls[3],MEMOLINE(cTxt,70,mTtL1), oFon2)

ENDIF

nRow++

IF (nRow*mLarg) >= ( oPrn:nVertRes()-(8*mLarg) )

oPrn:Say(oPrn:nVertRes()-(6*mLarg), nCls[1], "PAG: "+STRZERO(nPag,2), oFont)

nRow := 3

nPag ++

oPrn:EndPage()

oPrn:StartPage()

oPrn:Say(nRow*mLarg, nCls[1], OemToAnsi("RELATàRIO DE ATIVIDADES"), oFont)

nRow++

FOR Y := 1 TO 90

oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont)

NEXT

nRow++

oPrn:Say( nRow*mLarg, nCls[1], OemToAnsi("DATA"), oFont )

oPrn:Say( nRow*mLarg, nCls[2], OemToAnsi("HORA"), oFont )

oPrn:Say( nRow*mLarg, nCls[3], OemToAnsi("ACAO"), oFont )

nRow+=2

FOR Y := 1 TO 90

oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont)

NEXT

nRow++

ELSE

nRow++

ENDIF

DbSkip(1)

END

FOR Y := 1 TO 90

oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont)

NEXT

oPrn:Say(oPrn:nVertRes()-(6*mLarg), nCls[1], "PAG: "+STRZERO(nPag,2), oFont)

oPrn:EndPage()

oPrn:Preview()

RELEASE FONT oFont, oFon2

DbGotop()

oLogBrw:UpStable()

oLogBrw:Refresh()

RETURN NIL

**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**

STATIC FUNCTION DelLog(DbfLog,oLogBrw)

IF MsgNoYes(OemToAnsi("Confirma a exclusÆo definitiva destas informa‡äes?"),OemToAnsi("Aten‡Æo"))

&(DbfLog)->(DBGOTOP())

WHIL ! &(DbfLog)->(EOF())

WHILE ! &(DbfLog)->(rlock()) ; ERROREDE() ; END

&(DbfLog)->(DBDELETE())

&(DbfLog)->(DBSKIP(1))

END

oLogBrw:UpStable()

oLogBrw:Refresh()

ENDIF

RETURN NIL

**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**

id=code>id=code>

Ariston Santos

FWPPC / Fwh / xHarbour / Bcc55 / xDev / Workshop

Conheça o pacote fivewin: www.arsoft-ap.com.br

"Leia a Bíblia diariamente"

Link to comment
Share on other sites

Oi Geraldo

Eu montei uma tabela no mysql que chamei de logsis

tinha

usuario = char 8

data = data

hora = hora

tabela = char 15

chave do registro = char 20 ( ou qualquer identificador do registro ).

operação = inc / alt / exc

A toda tabela que sofria qualquer atualização rodava essa função

Gera_log(wUsuario,Dtoc(Date()),time(),"tabcliente","inc")

Funcionava beleza e depois desativei. O custo x beneficio não compensou.

Tava ficando maior que a base do próprio sistema e o backup estava demorando cada vez mais.

Sei lá, voce pode optar por zerar mensalmente. Fica a dica.

logo.gif

Link to comment
Share on other sites

Obrigado pela dica Ariston. José essa foi exatamente a minha dúvida, eu já faço mais ou menos como você falou, mas apenas em algumas tabelas, mas mesmo assim achei o mesmo, vai ficando muito grande.

Vou pensar um pouco mais sobre o assunto.

Abraços,

Geraldo B. Silva

FWH 2.6 Junho/2005, xHarbour 0.99.50 (Simplex), Bcc55, Pelles, xDev, MyMake, Sqllib e MySql.

lucgera@terra.com.br

São Paulo - SP

Link to comment
Share on other sites

Se for DBF esquece, porem se for banco de dados o espaço nao será problema.

citação:

Obrigado pela dica Ariston. José essa foi exatamente a minha dúvida, eu já faço mais ou menos como você falou, mas apenas em algumas tabelas, mas mesmo assim achei o mesmo, vai ficando muito grande.

Vou pensar um pouco mais sobre o assunto.

Abraços,

Geraldo B. Silva

FWH 2.6 Junho/2005, xHarbour 0.99.50 (Simplex), Bcc55, Pelles, xDev, MyMake, Sqllib e MySql.

lucgera@terra.com.br

São Paulo - SP


id=quote>id=quote>

EMotta Sistemas

Eduardo Motta

emotta@gmail.com.br

FWH 9.09 - xHARBOUR 1.2.1

Fivewin desde 2000

xHarbour desde 2002

Link to comment
Share on other sites

ola..

eu tenho o log de eventos nos meus prgs.. que grava quem foi o ultimo a mexer no registro ou quem deletou ou incluiu, porem jogo para o dbf.. e fica realmente muito grande, seja dbf ou sql.. o link queo willian passou estive dando uma olhada.. e parece que joga par um txt..

alguem conseguiu entender ou implementar??? outra coisa.. o que é defaut do harbour .. alguem tem conhecimento???

o que eu busco é saber o que o usuario alterou.. e nao somente saber que houve alteracao.. ja pensei nisso mas acho que ficaria lento ficar comparando o que tinha no banco de dados e o que ta alterando... campo a campo..

alguem tem alguma ideia neste sentido???

vitor

s.b.c.

Link to comment
Share on other sites

citação:

outra coisa.. o que é defaut do harbour .. alguem tem conhecimento???


id=quote>id=quote>

Ola Vitor, DEFAULT se usa para dar um valor para variavel como padrão caso ela esteja vazia

Exemplo:

atualiza()

function atualiza(diretorio)

default diretorio:="C:\REMESSA"

.

.

.

return

neste exemplo ao chamar a funcao atualiza nao foi informado o parametro diretorio dai ele vai assumir o default...

Abraços

Luiz Fernando

msn: empresoft@globo.com

skype:empresoft

empresoft@globo.com

FWH 8.04,XHARBOUR 1.1,PELES,XDEV,VLIB,ADS 8.1

FWH 9.12,XHARBOUR 1.2,ADS 9.0

Link to comment
Share on other sites

ola luiz..

nao foi isso que perguntei..

no link que o willian passou.. tem uma informacao assim:

"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."

é essas funcoes nativas que eu me refiro.. fiz a pergunta errada...

vitor

Link to comment
Share on other sites

Geraldo dá uma olhada como eu uso:


Exemplo 1:

Try

Copy File (cDirCol+Varquivo) To (cDirCol+Vsalva)

Catch

LogFile((cDirCol)+"ERRO.LOG", {"Backup: Arquivo gerado pelo coletor: "+nColetor[nConta]+" inconcistente."})

End

Exemplo 2:

use (cDirRec)+"TEMPCMD" Shared

if NetErr()

dbCloseAll()

LogFile((cDirCol)+"ERRO.LOG", {"Erro de Rede ao abrir pasta do sistema da Recepção (TEMPCMD)"})

Return NIL

endif

O aquivo fica assim:

ERRO.LOG:

03/09/2010 18:40:53: Arquivo TEMPCMD.DBF não encontrado na pasta C:\SISREC\

id=code>id=code>

AtnSoft(Antenor Rabello) - xHarbour 0.99.71 / FwH 7.05 / Verce

Link to comment
Share on other sites

Boa noite a todos

Eu tambem precisei fazer um sistema de auditoria interna no sistema a pedido dos proprietarios. Como eu uso a SQLRDD com Mysql, após estudar todas as opcoes nos forums da Web, para mim a melhor escolha foi:

- Em todos os itens criticos do sistema que precisam sofrer auditoria eu gravo num arquivo texto de LOG.

- Um exemplo de onde registrar o LOG, seria na Exclusao de Clientes . Seria registrado a DATA , a HORA, o USUARIO e uma descricao do que o usuario mudou .

Apos excluir o cliente chame:

operador:= "PEDRO MALAZARTE"

processo:= "Excluiu o Cliente: Pedro da Silva Santos"

registra_log(Operador,processo)

Simples assim. Ele gera o arquivo SISTEMA.LOG com todas as informacoes para auditoria.

abaixo segue a funcao registra_log()

Abraço

William Adami

FUNCTION registra_log( cOperador,minha_info)

LOCAL ret_line := "chr(13)+chr(10)", errfile := "sistema.log"

if len(coperador)<15

coperador:=coperador+ space(15-len(coperador))

endif

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()+" "+substr(cOperador,1,15)+" "+MINHA_INFO+&ret_line.)

FCLOSE(errhandle)

RETURN(.T.)

Xharbour 1.0 - Fwh - Sqlrdd , Mysql 5.0, PHP, WS , Timprime 4.0 , Display 2.0

Link to comment
Share on other sites

Vitor bom dia, para saber o que foi alterado, vc deve montar a frase que vai ser registrada no log.

por exemplo, na alteracao vc alterou o nome PEDRO DOS SANTOS para JOSE DA SILVA. entao a frase que vc deve montar para registrar no log seria:

operador:= "PEDRO MALAZARTE"

processo:= "Alterou PEDRO DA SILVA para JOSE DA SILVA"

registra_log(Operador,processo)

ou seja , a informacao que vai ser registrada no log é vc quem monta portanto dá sim para saber o que foi alterado ou qualquer informacao que vc queira registrar.

abraço

William

Xharbour 1.0 - Fwh - Sqlrdd , Mysql 5.0, PHP, WS , Timprime 4.0 , Display 2.0

Link to comment
Share on other sites

citação:o problema é ficar comparando campo a campo pra descobrir o que foi alterado..

ja imaginou uma rotina assim


id=quote>id=quote>

para casos como estes Vitor e muito comum jogar esta rotina de logs dentro do banco como um Trigger (qdo estamos trabalhando com bancos SQL).... Como vantagens destacam-se a velocidade, o fato de serem disparadas automaticamente e dependendo do caso ha ainda a opcao de detectarmos quais campos foram alterados facilmente.

assinatura.jpg

Link to comment
Share on other sites

  • 11 months later...

Eu fiz assim meus amigos.

Tenho uma tabela no MYSQL de logs, onde gravo o nome da tabela que sofreu mudanças, e um resumo do que mudou.

E controlo por ela, ou seja deixo as 500 ultimas mudanças na tabela. (tem algumas que deixo mais.) Porem realmente vai ficando pesado pra fazer bkp.

Dai fiz uma coisa que é assim.

Quando ela está com 20.000 registros ou mais eu disparo um comando para limpar os mais antigos por tabela..

Por periodo, e é uma opção que o usuario master term que fazer caso contrario o sistema não deixa elelogar...

Resolveu meu problema e me salvou de uma fria faz uns 40 dias.

Pois o Cara jurava de pé Junto pela alma da mae dele que não era ele quem tinha baixado a parcela do contas a Receber.

Dai ela não Sabia do Registro de Auditoria. Resumindo ele baixou, depois apagou a parcela. Porem ele se esqueceu que o sistema Registra isso no Movimento de Caixa. Dai Justa causa nele....

Márcio :.

informaisvrb@gmail.com

FWHX 2.6+ SQLLIB + xDev + rpv + MYSQL 5.0 / fwh808+sqllib(atual)

Msn.: mastermarvrb@msn.com

Editado por - marcio on 24/08/2011 22:03:05

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...