Escrevendo logs para um arquivo customizado

Uma parte muito importante do desenvolvimento de um software, mas que normalmente acaba esquecida ou sendo feita de qualquer forma são os logs da aplicação.

Logs ajudam muito em processos de debug em produção, pois podemos consultar-los para tentar entender o que está acontecendo sem ter que parar o programa em execução.

Usar somente o log.Println não resolve nosso problema, já que dessa forma os logs serão impressos somente no terminal. O ideal então é escrever os logs em arquivos.

Para que o package log do Go escreva os logs em arquivo ao invés do terminal, precisamos executar alguns passos antes de escrever nossa mensagem de log. Para que possamos reutilizar a escrita em qualquer parte do nosso programa, vamos criar um package com todas as configurações necessárias.

Primeiramente vamos criar uma pasta logs e um arquivo log.go. Nesse arquivo, vamos criar uma função Write para escrever nossos logs.

func Write(message, filepath string) {

}

Nessa função vamos ter 2 parâmetros. O primeiro sendo a mensagem e o segundo o caminho do arquivo onde o log será escrito.

Agora, vamos iniciar nossa função abrindo o arquivo onde o log será escrito.

func Write(message, filepath string) {
    if filepath == "" {
        filepath = "/tmp/my-app.log"
    }

    file, err := os.OpenFile(filepath, os.O_APPEND|os.O_RDWR|os.O_CREATE, 0644)
    if err != nil {
        log.Panic(err)
    }
    defer file.Close()
}

Como podemos ver acima, a primeira coisa que fiz foi validar se um filepath foi informado, e caso não tenha sido, seto um caminho genérico para o log ser escrito.

Ok! Agora que temos nosso arquivo aberto esperando para receber uma mensagem de log, tudo que precisamos fazer é configurar a saída do log e depois escrever nossa mensagem.

func Write(message, filepath string) {
    if filepath == "" {
        filepath = "/tmp/my-app.log"
    }

    file, err := os.OpenFile(filepath, os.O_APPEND|os.O_RDWR|os.O_CREATE, 0644)
    if err != nil {
        log.Panic(err)
    }
    defer file.Close()

    log.SetOutput(file)

    // loga data e hora
    log.SetFlags(log.LstdFlags)

    log.Println(message)
}

Para finalizar, vou criar uma função main somente para testar nosso package.

package main

import (
    "github.com/aprendagolang/log/logs"
)

func main() {
    logs.Write("olá mundo!", "./ola.log")
    logs.Write("funciona!!!", "")
}

É isso! Espero que tenham gostado!

Deixem suas dúvidas nos comentários.

Até a próxima!


Subscreva

Fique por dentro de tudo o que acontece no mundo Go.

Deixe uma resposta