Como utilizar logs estruturados com log/slog

Lançado recentemente, o Go 1.21 trouxe um novo package padrão na linguagem, o log/slog. Embora Go tenha um package de logs desde seu lançamento, ao longo dos anos, ficou claro que as aplicações Go precisavam de logs estruturados.

Diferente do formato padrão em texto puro, logs estruturados utilizam o formato chave=valor, facilitando muito na hora de fazer parse, buscar e analisar os logs.

Embora existam vários packages open source que desempenham esse papel, sendo o logrus um dos mais famosos, todos os anos, a comunidade continuava pedindo ao time do Go que essa funcionalidade fosse adicionada ao package oficial da linguagem.

Nesse post, vou explorar um pouco desse package, mostrando as principais funções e formas de utilização.

Leia mais »

Formatando strings para logs e mensagens

Se você já trabalha com Go a algum tempo, muito provavelmente você já conhece e utiliza o %s, %d e o \n. Pois bem, nesse post vamos abordar os principais os verbos disponíveis para te ajudar na hora de formatar uma string em Go.

Se você é novo em Go, saiba que os verbos que vamos abordar nesse post podem ser utilizados com as funções Printf, Sprintf e Errorf do package fmt, assim como as funções Fatalf, Panicf e Printf do package log.

Para começar, vamos a um exemplo bem simples utilizando somente os dois verbos que já comentamos. Digamos que nosso programa, sempre que alguém pede um novo café, exibe o nome da pessoa e a quantidade de café que ela consumiu no dia.

func main() {
    name := "Tiago"
    coffee := 5

    fmt.Printf("Olá %s, você já bebeu %d cafés hoje", name, coffee)
}

Ao ser executado, o %s será substituido pelo conteúdo da váriavel name, e o %d pela vafiável coffee.

Leia mais »

Escrevendo logs em formato JSON com zerolog

Algum tempo atrás fizemos um post falando sobre como escrever logs em arquivos. No post em questão, logamos algumas mensagens de forma bem simples. Normalmente esses logs em texto puro são um pouco complicados para filtrar mensagens, já que é preciso muito regex.

Nesse post vamos abordar os logs de uma forma diferente, pois vamos escreve-los em formato JSON.

Para nos auxiliar nessa tarefa, vamos utilizar um package chamado zerolog. Esse package foi criado pelo Olivier Poitrey, atual diretor de engenharia do Netflix.

Gosto muito desse package pois ele é fácil de usar e tem uma performance muito boa.

Sem mais enrolação, vamos instalar o package e começar a brincar com ele.

$ go get -u github.com/rs/zerolog/log
Leia mais »

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.

Leia mais »