Перейти к содержанию

Паттерн: Практики логирования

Этот кейс демонстрирует правила использования встроенного логгера chutils.setup_logger, сквозного контекста событий и безопасного вывода ошибок и секретов.


Что не так в bad_pattern.py?

  1. Использование print(): Сырой вывод через print() не имеет уровней критичности (DEBUG, INFO, ERROR), не структурирован и не попадает в ротируемые файлы логов, настроенные в системе.
  2. Ручной вызов logging.basicConfig: Инициализация стандартного basicConfig переопределяет глобальные настройки логирования и ломает конфигурации других модулей и сторонних библиотек.
  3. Утечка секретов в логи: python logger.info(f"Processing transaction: user={user_id}, token={token}...") Токены авторизации и пароли записываются в логи в открытом виде. В случае компрометации файлов логов это приведет к серьезной утечке безопасности.
  4. Ручное форматирование контекста: В каждое сообщение вручную встраиваются переменные user_id. Это приводит к дублированию кода и усложняет автоматический парсинг логов (например, в ELK/Graylog).
  5. Логирование ошибок без стека (Traceback): python logger.error(f"Произошла ошибка: {e}") Перехватывается только текстовое сообщение исключения. Информация о том, на какой конкретно строчке кода и в каком файле произошел сбой, теряется.

Что сделано правильно в good_pattern.py?

  1. Логгер библиотеки chutils: python logger = setup_logger(name="transaction_service") Используется настроенный логгер. Он автоматически поддерживает конфигурационные файлы config.yml, вывод в ротируемые сжатые файлы, структурированный JSON-формат (для production) и цветной Rich-вывод (для локальной разработки).
  2. Сквозное контекстное логирование: python with bind_context(user_id=user_id, action="process_transaction"): logger.info("Начало обработки транзакции...") Использование bind_context автоматически добавляет поля user_id и action в метаданные каждого лога, созданного внутри блока with. Это избавляет от ручной сборки строк и позволяет легко фильтровать логи в Kibana/Elasticsearch.
  3. Автоматическое маскирование секретов: Логгер chutils автоматически ищет в аргументах и сообщениях логов ключи, содержащие token, password, secret ( и маскирует PII-данные: почту, телефоны). Значение токена в логах заменится на [MASKED].
  4. Логирование с полным стеком: python logger.exception("Ошибка при выполнении транзакции") Вызов logger.exception() в блоке except автоматически прикрепляет traceback ошибки. Это позволяет быстро локализовать баг по строке кода.
  5. Ленивое форматирование логов: python logger.info("Начало обработки на сумму: %s", amount) Вместо f-строк используется синтаксис с плейсхолдерами %s. Строка форматируется только в том случае, если уровень логгера позволяет сделать вывод (например, если уровень установлен в WARNING, f-строка INFO всё равно выполнит форматирование и потратит процессорное время, а ленивый вариант — нет).

Ключевой совет для ИИ

[!IMPORTANT] Всегда используйте логгер от chutils (setup_logger), привязывайте сквозные идентификаторы через bind_context и записывайте исключения только через logger.exception(). Никогда не логируйте секреты и избегайте использования print().