Комментарий пользователя
Здравствуйте! Логи у нас разбрасываются по print и парсятся криво. Хочу нормальное JSON-логирование, ротацию и отправку в центр логирования. С чего начать?
Ответ специалиста
Добрый день, Марина! Начните с модуля logging, который уже есть в Python, плюс python-json-logger для JSON-формата.
Логи пишите в файл с ротацией, а Filebeat/Fluentd пусть собирает их в ELK.
Вот простой пример:
import logging
from logging.handlers import TimedRotatingFileHandler
from pythonjsonlogger import jsonlogger
logger = logging.getLogger("app")
logger.handlers.clear() # убираем дублирующие handlers
logger.setLevel(logging.INFO)
# Файл с ротацией
file_handler = TimedRotatingFileHandler("app.log", when="midnight", backupCount=7)
formatter = jsonlogger.JsonFormatter(
'%(asctime)s %(levelname)s %(name)s %(module)s %(message)s %(extra)s'
)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# stdout для контейнеров
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger.info("service started", extra={"env": "prod", "version": "1.2.3"})
В app.log и stdout получаются чистые JSON-строки, готовые для ELK. Filebeat их автоматически разберет.
Для контекста (request_id, user_id) добавляйте через extra={} или используйте фильтры. В продакшене настройки ротации и уровня логов выносите в конфиг. Обязательно протестируйте с локальным ELK — убедитесь, что парсинг проходит корректно.
Следите за новостями и практическими гайдами по инфраструктуре вместе с Академией Selectel.