Criar um log em txt de forma genérica | Ti Responde 003

No vídeo de hoje, iremos responder a dúvida em como fazer um log genérico para criar arquivos txt.

Hoje, a dúvida foi feita pelo grande Bruno, onde ele perguntou que toda vez para criar logs, tem que usar FWFileWriter ou FWrite e portanto se existe alguma forma mais fácil do que sempre ter que escrever várias linhas.

Foi desenvolvido uma classe, chamada zLogGeneric, onde através de poucos comandos, é gerado o arquivo com o conteúdo.

E abaixo o código fonte desenvolvido para exemplificar:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} zLogGeneric
Classe para gerar um log genérico de arquivo txt
@author Atilio
@since 29/12/2021
@example
    //Variáveis usadas
    cPasta   := "C:\logs\"
    cArquivo := "log.txt"
    lHora    := .T.

    //Cria o log
	oLogGen  := zLogGeneric():New(cPasta, cArquivo, lHora)

    //Adiciona um texto
    oLogGen:AddText("Usuário clicou no botão Confirmar")

    //Encerra e mostra o txt
    oLogGen:Finish()
/*/

Class zLogGeneric
	//Atributos
	Data cDirectory
	Data cFileName
	Data lShowTime
    Data oFWriter
    Data lOpenFile

	//Métodos
	Method New() CONSTRUCTOR
	Method AddText()
	Method Finish()
EndClass

Method New(cDir, cFile, lShow, lOpen) Class zLogGeneric
	Default cDir  := GetTempPath()
    Default cFile := "log_" + dToS(Date()) + "_" + StrTran(Time(), ":", "-") + ".txt"
    Default lShow := .T.
    Default lOpen := .T.

    //Se a pasta não existir, cria ela
    If ! ExistDir(cDir)
        MakeDir(cDir)
    EndIf

    //Define os atributos
    ::cDirectory := cDir
	::cFileName  := cFile
	::lShowTime  := lShow
    ::lOpenFile  := lOpen

    //Cria o arquivo de logs
    ::oFWriter := FWFileWriter():New(::cDirectory + ::cFileName, .T.)
     
    //Se houve falha ao criar, mostra a mensagem
    If ! ::oFWriter:Create()
        Final("Houve um erro ao criar o arquivo - " + ::oFWriter:Error():Message)
    
    //Senão, no log escreve um cabeçalho para identificar a rotina
    Else
        ::oFWriter:Write("Código do Usuário: " + RetCodUsr() + CRLF)
        ::oFWriter:Write("Nome do Usuário:   " + UsrRetName(RetCodUsr()) + CRLF)
        ::oFWriter:Write("Função (FunName):  " + FunName() + CRLF)
        ::oFWriter:Write("Ambiente:          " + GetEnvServer() + CRLF)
        ::oFWriter:Write(CRLF)
        ::oFWriter:Write("Log iniciado, data [" + dToC(Date()) + "] e hora [" + Time() + "]" + CRLF)
        ::oFWriter:Write("--" + CRLF)
        ::oFWriter:Write(CRLF)
    EndIf
Return Self

Method AddText(cText) Class zLogGeneric
    Default cText := ""

    //Se for mostrar a hora, adiciona ela a esquerda
    If ::lShowTime
        cText := "[" + Time() + "] " + cText
    EndIf

    //Escreve o texto do log
    ::oFWriter:Write(cText + CRLF)
Return

Method Finish() Class zLogGeneric
    //Mostra um texto no fim do arquivo
    ::oFWriter:Write(CRLF)
    ::oFWriter:Write("--" + CRLF)
    ::oFWriter:Write("Log encerrado, data [" + dToC(Date()) + "] e hora [" + Time() + "]")

    //Encerra o arquivo
    ::oFWriter:Close()

    //Se não for via job/webservice e tiver definido para abrir o arquivo
    If ! IsBlind() .And. ::lOpenFile
        ShellExecute("OPEN", ::cFileName, "", ::cDirectory, 1)
    EndIf
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação