Паттерн: Практики логирования
Этот кейс демонстрирует правила использования встроенного логгера chutils.setup_logger, сквозного контекста событий и
безопасного вывода ошибок и секретов.
Что не так в bad_pattern.py?
- Использование
print(): Сырой вывод черезprint()не имеет уровней критичности (DEBUG, INFO, ERROR), не структурирован и не попадает в ротируемые файлы логов, настроенные в системе. - Ручной вызов
logging.basicConfig: Инициализация стандартногоbasicConfigпереопределяет глобальные настройки логирования и ломает конфигурации других модулей и сторонних библиотек. - Утечка секретов в логи:
python logger.info(f"Processing transaction: user={user_id}, token={token}...")Токены авторизации и пароли записываются в логи в открытом виде. В случае компрометации файлов логов это приведет к серьезной утечке безопасности. - Ручное форматирование контекста:
В каждое сообщение вручную встраиваются переменные
user_id. Это приводит к дублированию кода и усложняет автоматический парсинг логов (например, в ELK/Graylog). - Логирование ошибок без стека (Traceback):
python logger.error(f"Произошла ошибка: {e}")Перехватывается только текстовое сообщение исключения. Информация о том, на какой конкретно строчке кода и в каком файле произошел сбой, теряется.
Что сделано правильно в good_pattern.py?
- Логгер библиотеки
chutils:python logger = setup_logger(name="transaction_service")Используется настроенный логгер. Он автоматически поддерживает конфигурационные файлыconfig.yml, вывод в ротируемые сжатые файлы, структурированный JSON-формат (для production) и цветной Rich-вывод (для локальной разработки). - Сквозное контекстное логирование:
python with bind_context(user_id=user_id, action="process_transaction"): logger.info("Начало обработки транзакции...")Использованиеbind_contextавтоматически добавляет поляuser_idиactionв метаданные каждого лога, созданного внутри блокаwith. Это избавляет от ручной сборки строк и позволяет легко фильтровать логи в Kibana/Elasticsearch. - Автоматическое маскирование секретов:
Логгер
chutilsавтоматически ищет в аргументах и сообщениях логов ключи, содержащиеtoken,password,secret( и маскирует PII-данные: почту, телефоны). Значение токена в логах заменится на[MASKED]. - Логирование с полным стеком:
python logger.exception("Ошибка при выполнении транзакции")Вызовlogger.exception()в блокеexceptавтоматически прикрепляет traceback ошибки. Это позволяет быстро локализовать баг по строке кода. - Ленивое форматирование логов:
python logger.info("Начало обработки на сумму: %s", amount)Вместо f-строк используется синтаксис с плейсхолдерами%s. Строка форматируется только в том случае, если уровень логгера позволяет сделать вывод (например, если уровень установлен в WARNING, f-строка INFO всё равно выполнит форматирование и потратит процессорное время, а ленивый вариант — нет).
Ключевой совет для ИИ
[!IMPORTANT] Всегда используйте логгер от
chutils(setup_logger), привязывайте сквозные идентификаторы черезbind_contextи записывайте исключения только черезlogger.exception(). Никогда не логируйте секреты и избегайте использованияprint().