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.

Código: Selecionar todos

SET PRINTER TO 'ERRO.LOG' ADDITIVE 

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

Código: Selecionar todos

FLogTXT( "A mensagem que vc quer criar" )
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 :

Código: Selecionar todos

FLogTXT( "A mensagem que vc quer criar" , "nome.log" )
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.