Ответ
slog
— это пакет для структурированного логирования, который был добавлен в стандартную библиотеку Go начиная с версии 1.21. Он предоставляет более мощный, гибкий и производительный механизм логирования по сравнению со старым пакетом log
.
Основная проблема, которую решает slog
, — это создание логов, которые легко читать не только человеку, но и машине (системам сбора и анализа логов, таким как ELK Stack, Grafana Loki, Datadog).
Ключевые особенности и преимущества:
- Уровни логирования: Встроенная поддержка уровней (
Debug
,Info
,Warn
,Error
), что позволяет гибко настраивать детализацию логов для разных окружений. - Структурированный вывод: Логи по умолчанию выводятся в виде пар
ключ=значение
или в формате JSON. Это упрощает их парсинг, фильтрацию и индексацию. - Контекстная информация: Возможность добавлять атрибуты к логгеру, которые будут присутствовать во всех последующих сообщениях. Отлично интегрируется с
context.Context
. - Высокая производительность:
slog
разработан с упором на минимизацию аллокаций и накладных расходов, что делает его одним из самых быстрых решений для логирования в Go. - Гибкая настройка: Позволяет легко заменять обработчик (
Handler
) для изменения формата вывода (например, JSON, logfmt) или направления (stdout, файл, сетевое хранилище).
Пример использования:
package main
import (
"log/slog"
"os"
)
func main() {
// Создаем логгер с обработчиком, который пишет JSON в stdout
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
// Логируем событие с дополнительными атрибутами
logger.Info("user logged in",
slog.Int("user_id", 12345),
slog.String("ip_address", "192.168.1.101"),
)
}
Пример вывода (JSON):
{"time":"2023-10-27T10:00:00.000Z","level":"INFO","msg":"user logged in","user_id":12345,"ip_address":"192.168.1.101"}
В целом, slog
становится стандартом для логирования в современных Go-приложениях, заменяя сторонние библиотеки во многих проектах.