Какие библиотеки для расширенного логирования в Python вы знаете?

«Какие библиотеки для расширенного логирования в Python вы знаете?» — вопрос из категории Скриптинг и автоматизация, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-скриптах и инструментах на Python я активно использую логирование для отладки и мониторинга. Вот основные библиотеки:

1. Стандартный модуль logging

  • Применение: Базовый выбор для большинства скриптов автоматизации (Ansible модули, утилиты деплоя).
  • Пример настройки для JSON-формата (важно для ELK/Grafana Loki):
    
    import logging
    import json_log_formatter

formatter = json_log_formatter.JSONFormatter() json_handler = logging.FileHandler('/var/log/my_script.log') json_handler.setFormatter(formatter)

logger = logging.getLogger('deploy_script') logger.addHandler(json_handler) logger.setLevel(logging.INFO)

logger.info('Starting deployment', extra={'app': 'api-service', 'version': '1.2.3'})


**2. `structlog`**
- **Почему:** Идеален для структурированного логирования, которое потом парсится системами типа ELK Stack или Loki. Легко добавляет контекст (trace_id, hostname, stage).
- **Пример из практики:**
```python
import structlog
structlog.configure(
    processors=[
        structlog.processors.add_log_level,
        structlog.processors.TimeStamper(fmt="iso"),
        structlog.processors.JSONRenderer()
    ]
)
log = structlog.get_logger()
# Лог с контекстом для отслеживания пайплайна
log.error("Container health check failed", 
          container_id="abc123", 
          image="app:latest", 
          exit_code=137)

3. loguru

  • Почему: Максимально простая настройка ротации логов и цветного вывода в консоль. Отлично подходит для внутренних утилит и скриптов, где нужна быстрая отладка.
  • Пример:
    from loguru import logger
    logger.add("/var/log/deploy.log", 
           rotation="100 MB", 
           compression="zip", 
           format="{time} {level} {message}", 
           level="INFO")
    logger.bind(task_id="deploy_567").info("Pulling new image from registry")

Для продакшена я обычно комбинирую: structlog для основного приложения (генерирует JSON) и стандартный logging для интеграции с системными демонами или когда пишу плагины для существующих инструментов (например, кастомный модуль для Ansible).