Página 1 de 1
criar log de erros do sistema
Enviado: 17 Out 2020 20:12
por pena
boa noite, queria uma ajuda de como fazer, estou gerando um log quando acontece algumas alterações controladas ou erros do sistema, só que ele não esta incrementado a linha, e sim sempre gerando um arquivo novo, alguém teria um exemplo de como fazer, sei que estou fazendo errado, mas não sei como manipular arquivos textos. Estou fazendo assim
Código: Selecionar todos
SET PRINT ON
SET DEVICE TO PRINT
SET PRINTER TO "ERRO.LOG"
@ PROW()+1,01 SAY TEXTO
SET PRINTER TO
SET DEVICE TO SCREEN
criar log de erros do sistema
Enviado: 17 Out 2020 20:15
por Vlademiro
É melhor usar funções de escrita em arquivo. Vou procurar aqui e posto pra vc. Não agora porque não estou no computador, quer dizer, estou no computador mas é smartphone.
criar log de erros do sistema
Enviado: 17 Out 2020 20:24
por Vlademiro
Olhando o seu código vc deve colocar set printer to arquivo antes da chamada da função. Dentro da função apenas set device to print e screen.
Mas de qualquer maneira é melhor com função tipo fwrite
criar log de erros do sistema
Enviado: 17 Out 2020 23:40
por alxsts
Olá!
O uso das funções de baixo nível é mais sofisticado e
Permite um maior controle. Mas o set PRINTER TO... é menos trabalhoso. No teu caso faltou colocar a cláusula ADDITIVE. Com isto, ao invés de criar um novo arquivo, o sistema faz append no arquivo que já existe.
criar log de erros do sistema
Enviado: 17 Out 2020 23:53
por Vlademiro
Código: Selecionar todos
#include "fileio.ch"
FUNCTION FLogTXT( cTexto , cLogName , cLogLevel )
LOCAL nHandle, cContent
LOCAL cPreTexto := DTOS( DATE() ) + " - " + TIME() + " >> "
LOCAL cName := DTOS(DATE()) + ".log"
hb_Default( @cLogLevel , "STANDARD" )
cLogLevel := " [ " + cLogLevel + " ] "
cName := hb_DefaultValue( cLogName , cName )
IF .NOT. FILE( cName )
nHandle := FCREATE( cName )
ELSE
nHandle := FOPEN( cName , FO_READWRITE + FO_SHARED )
ENDIF
FSEEK( nHandle ,0,2)
cContent := cPreTexto + cLogLevel + cTexto
FWRITE( nHandle , cContent + HB_EOL() )
FCLOSE( nHandle )
RETURN cContent
Vc pode adaptar essa função para uso próprio.
Do jeito que ela está basta chamar assim, por exemplo
Ele vai criar um log no seguinte formato 20201017.log (é o ano+mes+dia seguida da extensao .log)
Caso queira informar o nome do arquivo :
Ele vai criar um arquivo nome.log
Se vc quiser acrescentar uma mensagem antes do log, tipo a severidade. Por exemplo: INFO, WARNING, FATAL, etc pode fazer assim
Código: Selecionar todos
FLogTXT( "A mensagem que vc quer criar" , NIL , "WARNING" )
Ele vai criar um log no seguinte formato 20201017.log com a mensagem "[WARNING]" antes da sua mensagem.
criar log de erros do sistema
Enviado: 18 Out 2020 00:38
por JoséQuintas
Já responderam.
Apenas sugestão adicional:
Código: Selecionar todos
FUNCTION Errorsys_WriteErrorLog( cText, nDetail )
LOCAL hFileOutput, cFileName, nCont, nCont2
hb_Default( @cText, "" )
hb_Default( @nDetail, 0 )
IF nDetail > 0
Errorsys_WriteErrorLog()
Errorsys_WriteErrorLog( "Error on " + Dtoc( Date() ) + " " + Time() )
Errorsys_WriteErrorLog( "EXE Name; " + hb_Argv(0) )
Errorsys_WriteErrorLog( "JPA: " + AppVersaoExe() )
Errorsys_WriteErrorLog( "Login JPA: " + AppUserName() )
Errorsys_WriteErrorLog( "Alias: " + Alias() )
Errorsys_WriteErrorLog( "Folder: " + hb_cwd() )
Errorsys_WriteErrorLog( "Windows: " + OS() )
Errorsys_WriteErrorLog( "Computer Name: " + GetEnv( "COMPUTERNAME" ) )
Errorsys_WriteErrorLog( "Windows User: " + GetEnv( "USERNAME" ) )
Errorsys_WriteErrorLog( "Logon Server: " + Substr( GetEnv( "LOGONSERVER" ), 2 ) )
Errorsys_WriteErrorLog( "User Domain: " + GetEnv( "USERDOMAIN" ) )
Errorsys_WriteErrorLog( "Harbour: " + Version() )
Errorsys_WriteErrorLog( "Compiler: " + HB_Compiler() )
Errorsys_WriteErrorLog( "GT: " + hb_GtInfo( HB_GTI_VERSION ) )
Errorsys_WriteErrorLog()
Errorsys_WriteErrorLog()
ENDIF
cFileName := "hb_out.log"
IF ! File( cFileName )
hFileOutput := fCREATE( cFileName )
fClose( hFileOutput )
ENDIF
hFileOutput := fOpen( cFileName, 1 )
fSeek( hFileOutput, 0, 2 )
fWrite( hFileOutput, cText + Space(2) + hb_Eol() )
IF nDetail > 1
nCont := 1
nCont2 := 0
DO WHILE nCont2 < 5
IF Empty( ProcName( nCont ) )
nCont2++
ELSE
cText := "Called from " + Trim( ProcName( nCont ) ) + "(" + Ltrim( Str( ProcLine( nCont ) ) ) + ") "
fWrite( hFileOutput, cText + hb_Eol() )
ENDIF
nCont++
ENDDO
fWrite( hFileOutput, hb_Eol() )
ENDIF
fClose( hFileOutput )
RETURN NIL
Desse jeito eu chamo de qualquer parte do aplicativo, em situações especiais.
Por exemplo, rejeição de NFE.
Informações adicionais podem ser interessantes, inclusive a "call stack".
o uso de hb_out.log, é porque esse nome é usado pelo Harbour pra outros tipos de erro, que não passam pela errorsys.