KubernetesLoggingRancher

Настройка централизованного логирования в Kubernetes кластере Rancher

Практическое руководство по настройке стека логирования с Go-сервисами на slog и отправкой логов в Loki

5 февраля 2026Арно Фернандес
Введение
Эффективное логирование в распределенных системах — критически важная задача для мониторинга и отладки

В современных Kubernetes-кластерах, особенно при использовании Rancher для управления, централизованное логирование становится необходимостью. В этой статье я расскажу о своем опыте настройки стека логирования для Go-сервисов, использующих slog, с отправкой логов в Loki через Rancher Logging.

Мы рассмотрим конфигурацию ClusterOutput, настройку фильтров парсинга JSON и интеграцию с существующей инфраструктурой мониторинга.

Архитектура решения

Go-сервисы с slog

Современные Go-приложения используют структурированное логирование через пакет slog, который появился в Go 1.21.

  • JSON-форматированные логи по умолчанию
  • Поддержка уровней логирования (DEBUG, INFO, WARN, ERROR)
  • Контекстные атрибуты для трассировки
  • Высокая производительность
Rancher Logging Stack

Rancher предоставляет встроенное решение для логирования на основе Fluent Bit/Fluentd.

  • Сбор логов со всех нод кластера
  • Гибкая конфигурация через CRD
  • Поддержка множества output-плагинов
  • Интеграция с экосистемой Grafana

Реализация логирования в Go

1package main 2 3import ( 4 "context" 5 "log/slog" 6 "net/http" 7 "os" 8 "time" 9) 10 11func main() { 12 // Настройка JSON-логгера 13 handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ 14 Level: slog.LevelDebug, 15 }) 16 logger := slog.New(handler) 17 slog.SetDefault(logger) 18 19 // Пример логирования с контекстом 20 ctx := context.WithValue(context.Background(), "request_id", "req-12345") 21 22 logger.Info("Сервис запущен", 23 "port", 8080, 24 "environment", "production", 25 "timestamp", time.Now().UTC(), 26 ) 27 28 // HTTP-обработчик с логированием 29 http.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) { 30 start := time.Now() 31 32 logger.Info("Обработка запроса", 33 "method", r.Method, 34 "path", r.URL.Path, 35 "user_agent", r.UserAgent(), 36 "request_id", r.Header.Get("X-Request-ID"), 37 ) 38 39 // Бизнес-логика... 40 time.Sleep(50 * time.Millisecond) 41 42 logger.Info("Запрос обработан", 43 "duration_ms", time.Since(start).Milliseconds(), 44 "status", 200, 45 ) 46 47 w.WriteHeader(http.StatusOK) 48 w.Write([]byte(`{"status": "ok"}`)) 49 }) 50 51 logger.Info("HTTP-сервер запущен", "addr", ":8080") 52 http.ListenAndServe(":8080", nil) 53}

Конфигурация Rancher Logging

ClusterOutput для Loki
Определение вывода логов в систему Loki
clusteroutput-loki.yaml
1apiVersion: logging.banzaicloud.io/v1beta1 2kind: ClusterOutput 3metadata: 4 name: loki-output 5 namespace: cattle-logging-system 6spec: 7 loki: 8 url: http://loki.monitoring.svc.cluster.local:3100 9 configure_kubernetes_labels: true 10 extra_labels: 11 cluster: "production" 12 buffer: 13 timekey: 1m 14 timekey_wait: 30s 15 timekey_use_utc: true
Flow с фильтрами парсинга
Конфигурация Flow с ключевыми фильтрами для обработки JSON-логов
clusterflow-go-services.yaml
1apiVersion: logging.banzaicloud.io/v1beta1 2kind: ClusterFlow 3metadata: 4 name: go-services-flow 5 namespace: cattle-logging-system 6spec: 7 match: 8 - select: 9 labels: 10 app.kubernetes.io/name: "go-service" 11 filters: 12 - parser: 13 key_name: message 14 parse: 15 type: json 16 remove_key_name_field: true 17 reserve_data: true 18 reserve_time: true 19 - record_transformer: 20 records: 21 - log_type: "application" 22 - language: "go" 23 - framework: "slog" 24 globalOutputRefs: 25 - loki-output

Пояснение ключевых параметров:

  • key_name: message — указывает, что JSON находится в поле message
  • parse.type: json — активирует JSON-парсер
  • remove_key_name_field: true — удаляет исходное поле message после парсинга
  • reserve_data: true — сохраняет все остальные поля записи
  • reserve_time: true — сохраняет временную метку из лога

Результаты и преимущества

Централизованный поиск

Все логи доступны в едином интерфейсе Grafana с мощным языком запросов LogQL

Структурированные данные

JSON-парсинг позволяет фильтровать и агрегировать логи по любому полю: уровень, метод, длительность

Производительность

Fluent Bit эффективно обрабатывает большие объемы данных с минимальным overhead

Рекомендации по использованию
Лучшие практики для эффективного логирования в продакшене
  1. Используйте структурированное логирование — всегда логируйте в JSON формате с четкой схемой полей
  2. Добавляйте контекстные поля — request_id, user_id, correlation_id для трассировки запросов
  3. Настройте уровни логирования — DEBUG для разработки, INFO для продакшена, ERROR для критических ситуаций
  4. Мониторьте объем логов — настройте retention policy в Loki и алерты на аномальный рост объема
  5. Тестируйте парсинг — убедитесь, что ваши JSON-логи корректно парсятся фильтрами Fluent Bit
Заключение

Настройка централизованного логирования в Kubernetes кластере Rancher с использованием Go-сервисов на slog и Loki предоставляет мощное решение для мониторинга распределенных систем.

Ключевым преимуществом является возможность использовать структурированные логи для продвинутого анализа, создания дашбордов и настройки алертов на основе конкретных полей логов.

Представленная конфигурация с фильтром парсинга JSON позволяет эффективно извлекать структурированные данные из логов Go-приложений и использовать их в полной мере в экосистеме Grafana/Loki.

Нужна помощь?

Мы поможем настроить мониторинг и алертинг для ваших Kubernetes-приложений. Свяжитесь с нами для консультации.