Логирование в Go: стандартные средства и лучшие практики

Ответ

Логирование в Go — это процесс записи информации о работе приложения для мониторинга, анализа и отладки. Существует два основных подхода: использование стандартной библиотеки и сторонних решений.

1. Стандартная библиотека (log)

Пакет log — простое и встроенное решение, подходящее для небольших утилит или примеров.

Пример использования:

package main

import (
    "log"
    "os"
)

func main() {
    // По умолчанию log пишет в os.Stderr
    log.Println("Это информационное сообщение.")

    // Можно перенаправить вывод, например, в файл
    file, _ := os.Create("app.log")
    log.SetOutput(file)
    log.Printf("Это сообщение будет записано в файл с параметром: %d", 123)

    // Fatalf записывает сообщение и завершает программу с кодом 1
    log.Fatalf("Критическая ошибка: %s", "не удалось подключиться к базе данных")
}

Ограничения log:

  • Нет уровней логирования: Отсутствует разделение на DEBUG, INFO, WARN, ERROR.
  • Неструктурированный вывод: По умолчанию выводит обычный текст, который сложно парсить автоматизированным системам.
  • Минимальная конфигурация: Ограниченные возможности по форматированию и управлению выводом.

2. Сторонние библиотеки (Лучшая практика)

Для production-систем рекомендуется использовать структурированные логгеры. Они записывают логи в формате JSON, что упрощает их сбор, поиск и анализ.

Популярные библиотеки:

  • Zerolog: Фокус на высокой производительности и минимальных аллокациях.
  • Zap: Очень быстрый и гибкий логгер от Uber.
  • Logrus: Более старый, но все еще популярный логгер с удобным API и хуками.

Преимущества структурированного логирования:

  • Уровни логирования (.Info(), .Error(), etc.).
  • Контекст: Возможность добавлять к логам структурированные поля (request_id, user_id).
  • Машиночитаемый формат (JSON): Идеально для систем сбора логов (ELK Stack, Grafana Loki, Datadog).

Пример вывода структурированного лога (Zerolog):

{"level":"error","request_id":"abc-123","error":"user not found","time":"2023-10-27T10:00:00Z","message":"Failed to process request"}