← Назад к вопросам

Что такое log?

1.3 Junior🔥 181 комментариев
#Observability

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Логирование (Logging) в программировании: сущность и применение

Лог (от англ. log — журнал, протокол) — это систематически записанная история событий, происходящих в программной системе, во время её выполнения. Это текстовый или структурированный файл (или поток данных), в который программа записывает информацию о своей работе: запуске, выполнении операций, ошибках, взаимодействии с пользователями или другими системами.

Основная цель логов

Логи служат нескольким критически важным целям:

  • Диагностика и отладка: позволяют понять, что происходило в системе до возникновения ошибки или неожиданного поведения.
  • Мониторинг: дают возможность отслеживать состояние системы, её производительность и использование в реальном времени.
  • Анализ поведения пользователей: в бизнес-приложениях логи могут фиксировать действия пользователей для дальнейшего анализа.
  • Аудит и безопасность: предоставляют записи о критических операциях (например, изменение данных, доступ к системам) для обеспечения безопасности и соответствия требованиям.
  • Профилирование: помогают находить узкие места в производительности путем записи времени выполнения ключевых операций.

Ключевые характеристики логов

  1. Уровни логирования (Log Levels): Для классификации важности сообщений используются уровни. Типичные уровни в Go (и многих других языках) включают:
    *   `DEBUG` — подробная информация для разработчиков (обычно не включается в production).
    *   `INFO` — общая информация о нормальной работе программы.
    *   `WARN` — потенциально проблемные ситуации, которые не являются ошибками.
    *   `ERROR` — ошибки, которые влияют на конкретную операцию, но не прекращают работу приложения.
    *   `FATAL` / `PANIC` — критические ошибки, приводящие к остановке программы.

  1. Структурированное vs. неструктурированное логирование: Традиционные логи — это простые текстовые строки. Современный подход — структурированное логирование, где каждое сообщение представляет собой объект данных (например, JSON) с четкими полями (timestamp, level, message, context).

Логирование в Go

В Go для логирования часто используется стандартная библиотека log. Однако для сложных проектов применяются мощные сторонние библиотеки, такие как zap от Uber (очень быстрая), logrus (популярная, с поддержкой уровней) или стандартный slog, появившийся в Go 1.21.

Пример базового логирования с помощью стандартного пакета log:

package main

import (
    "log"
    "os"
)

func main() {
    // Лог в stdout с префиксом
    log.Println("Это обычное сообщение лога")

    // Лог в файл
    file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatal("Не удалось открыть файл лога:", err)
    }
    defer file.Close()

    log.SetOutput(file)
    log.Println("Это сообщение записано в файл")

    // Лог с уровнем FATAL (завершает программу)
    // log.Fatal("Критическая ошибка, программа остановлена")
}

Пример структурированного логирования с использованием новой библиотеки slog:

package main

import (
    "log/slog"
    "os"
)

func main() {
    // Создаём логгер с выводом в JSON
    logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

    // Структурированное сообщение с дополнительными полями (attributes)
    logger.Info("запрос обработан",
        slog.Int("status_code", 200),
        slog.String("method", "GET"),
        slog.String("path", "/api/users"),
        slog.Duration("duration", 150000000), // 150ms в наносекундах
    )

    logger.Error("не удалось подключиться к базе данных",
        slog.String("error", "connection timeout"),
        slog.String("host", "db.example.com"),
    )
}

Вывод slog в JSON формате будет выглядеть так:

{"time":"2023-10-05T12:00:00Z","level":"INFO","msg":"запрос обработан","status_code":200,"method":"GET","path":"/api/users","duration":150000000}
{"time":"2023-10-05T12:00:01Z","level":"ERROR","msg":"не удалось подключиться к базе данных","error":"connection timeout","host":"db.example.com"}

Практические рекомендации для Go разработчика

  • Выбирайте подходящую библиотеку: Для высоконагруженных сервисов — zap. Для стандартизации и простоты — slog. Для проектов с богатым набором функций — logrus.
  • Логируйте контекст: Каждое сообщение должно содержать достаточный контекст (идентификатор запроса, параметры функции, состояние системы) для возможности восстановления событий.
  • Избегайте логирования в production на уровне DEBUG: Это может снизить производительность и привести к огромным объемам данных.
  • Не логируйте чувствительную информацию: Пароли, токены, персональные данные никогда не должны попадать в логи.
  • Используйте централизованное управление логами: В распределённых системах логи должны агрегироваться в центральные системы (например, ELK Stack — Elasticsearch, Logstash, Kibana; Grafana Loki; или облачные решения).

Таким образом, лог — это не просто текстовый файл с сообщениями, а жизненно важный инструмент для разработки, поддержки и анализа программных систем. Грамотное логирование значительно сокращает время на поиск и устранение проблем, повышает стабильность системы и обеспечивает понимание её внутренней работы.