Logs básicos
Os logs são registros de informações geradas durante a execução de um programa, eles servem para acompanhar o funcionamento e identificar possíveis problemas. Podemos criar logs usando o package log, que oferece funções para registrar mensagens com data e hora. Também temos o package log/slog, que permite organizar os registros por níveis, como informações, avisos e erros.
Criando logs com o package log
O package log faz parte da biblioteca padrão do Go e permite registrar mensagens de forma parecida com fmt.Println, mas adicionando automaticamente a data e a hora em que cada mensagem foi gerada. Por padrão, essas mensagens são enviadas para o stderr, que já estudamos anteriormente.
package main
import "log"
func main() {
// Registra informações sobre a execução.
log.Println("Programa iniciado")
log.Println("Carregando usuários...")
log.Println("Usuários carregados com sucesso")
}
Resultado possível:
2026/10/10 10:30:00 Programa iniciado
2026/10/10 10:30:00 Carregando usuários...
2026/10/10 10:30:00 Usuários carregados com sucesso
A diferença de log.Println(), é que ele registra as mensagens sem a gente precise informar manualmente a data e a hora, o outro lado que não vemos, é que ele não usa stdout e sim stderr.
Também podemos usar log.Printf() quando precisamos formatar os valores dentro da mensagem.
quantidade := 20
// Registra uma mensagem com formatação.
log.Printf("Foram encontrados %d usuários", quantidade)
Níveis de log com slog
O package log/slog foi adicionado à biblioteca padrão do Go na versão 1.21 e permite criar logs estruturados, organizando as mensagens por níveis e adicionando informações em formato de chave e valor. Os níveis servem para identificar a importância de cada registro. O DEBUG é usado para informações detalhadas durante o desenvolvimento, o INFO para registrar o funcionamento normal do programa, o WARN para situações que precisam de atenção e o ERROR para registrar problemas que ocorreram durante a execução.
package main
import (
"log/slog"
"os"
)
func main() {
// Cria um logger que escreve no stdout.
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
// Registra informações em diferentes níveis.
logger.Debug("Iniciando conexão")
logger.Info("Programa iniciado")
logger.Warn("Conexão demorando para responder")
logger.Error("Falha ao conectar")
}
Resultado possível:
time=2026-10-10T10:30:00-03:00 level=INFO msg="Programa iniciado"
time=2026-10-10T10:30:00-03:00 level=WARN msg="Conexão demorando para responder"
time=2026-10-10T10:30:00-03:00 level=ERROR msg="Falha ao conectar"
Observe que a mensagem DEBUG não apareceu, isso acontece porque o slog usa o nível INFO como padrão, mostrando apenas mensagens desse nível ou superiores. Para permitir mensagens de DEBUG, podemos configurar o nível mínimo usando slog.HandlerOptions.
// Cria um logger que também mostra mensagens DEBUG.
logger := slog.New(slog.NewTextHandler(
os.Stdout,
&slog.HandlerOptions{
Level: slog.LevelDebug,
},
))
Também podemos adicionar informações aos logs por meio de pares de chave e valor.
// Registra informações sobre o usuário.
logger.Info("Usuário cadastrado", "id", 10, "nome", "Ana")
Resultado possível:
time=2026-10-10T10:30:00-03:00 level=INFO msg="Usuário cadastrado" id=10 nome=Ana
Além do formato de texto, o slog também permite gerar registros em JSON usando slog.NewJSONHandler(), o que facilita o processamento dos logs por ferramentas de monitoramento.