Как настроить несколько обработчиков для записи логов в разные места (например, файл и консоль)?

Для настройки нескольких обработчиков логов можно использовать модуль logging в Python. Сначала создается логгер, затем для него настраиваются разные обработчики (Handler). Каждый обработчик можно настроить для вывода логов в определенное место (файл, консоль и т.д.) и с определенным уровнем логирования. Например:

  import logging

  # Создаем логгер
  logger = logging.getLogger('my_logger')
  logger.setLevel(logging.DEBUG)

  # Создаем обработчик для записи в файл
  file_handler = logging.FileHandler('my_app.log')
  file_handler.setLevel(logging.INFO)

  # Создаем обработчик для вывода в консоль
  console_handler = logging.StreamHandler()
  console_handler.setLevel(logging.DEBUG)

  # Создаем форматтер
  formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  file_handler.setFormatter(formatter)
  console_handler.setFormatter(formatter)

  # Добавляем обработчики к логгеру
  logger.addHandler(file_handler)
  logger.addHandler(console_handler)

  # Используем логгер
  logger.debug('Это отладочное сообщение')
  logger.info('Это информационное сообщение')
  logger.warning('Это предупреждение')
  logger.error('Это ошибка')
  logger.critical('Это критическая ошибка')
  
В этом примере, отладочные сообщения (DEBUG) будут выводиться только в консоль, а информационные (INFO) и выше - и в файл, и в консоль.

Настроить несколько обработчиков для записи логов в разные места можно с помощью модуля logging в Python. Основная идея заключается в создании нескольких обработчиков (Handlers) и привязке их к одному или нескольким логгерам (Loggers). Вот пример, как это можно сделать для записи в файл и в консоль:


  import logging

  # 1. Создаем логгер
  logger = logging.getLogger('my_logger')
  logger.setLevel(logging.DEBUG)  # Устанавливаем минимальный уровень логирования

  # 2. Создаем обработчик для записи в файл
  file_handler = logging.FileHandler('my_application.log')
  file_handler.setLevel(logging.INFO) # Устанавливаем минимальный уровень логирования для файла

  # 3. Создаем обработчик для вывода в консоль
  console_handler = logging.StreamHandler()
  console_handler.setLevel(logging.DEBUG) # Устанавливаем минимальный уровень логирования для консоли

  # 4. Создаем форматтеры для обработки сообщений
  formatter_file = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  formatter_console = logging.Formatter('%(levelname)s: %(message)s')


  # 5. Привязываем форматтеры к обработчикам
  file_handler.setFormatter(formatter_file)
  console_handler.setFormatter(formatter_console)

  # 6. Добавляем обработчики к логгеру
  logger.addHandler(file_handler)
  logger.addHandler(console_handler)


  # 7. Используем логгер
  logger.debug('Это отладочное сообщение')  # Выводится только в консоль, если ее уровень DEBUG
  logger.info('Это информационное сообщение') # Выводится и в файл, и в консоль
  logger.warning('Это предупреждение')       # Выводится и в файл, и в консоль
  logger.error('Это сообщение об ошибке')     # Выводится и в файл, и в консоль
  logger.critical('Это критическое сообщение') # Выводится и в файл, и в консоль
  

Пояснения:

  • logging.getLogger('my_logger') создает или возвращает существующий логгер с указанным именем. Можно использовать любое имя, важно, чтобы оно было согласовано во всем коде.
  • logger.setLevel(logging.DEBUG) устанавливает минимальный уровень, начиная с которого сообщения будут обрабатываться.
  • logging.FileHandler('my_application.log') создает обработчик для записи в файл. Укажите желаемое имя файла.
  • logging.StreamHandler() создает обработчик для вывода в стандартный поток (обычно консоль).
  • setLevel() у каждого обработчика определяет минимальный уровень логирования, который будет им обрабатываться. Это позволяет, например, писать только важную информацию в файл, а все остальное выводить в консоль во время разработки.
  • logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') создает объект Formatter, который определяет формат записи лога. Доступны различные переменные, такие как %(asctime)s (время), %(name)s (имя логгера), %(levelname)s (уровень логирования) и %(message)s (сообщение).
  • setFormatter() привязывает форматтер к обработчику.
  • addHandler() добавляет обработчик к логгеру. Один логгер может иметь несколько обработчиков.
  • Вызовы методов logger.debug(), logger.info(), logger.warning(), logger.error() и logger.critical() создают записи в логе с соответствующими уровнями.

Ключевые моменты:

  • Можно создавать сколько угодно обработчиков и привязывать их к логгеру.
  • Каждый обработчик может иметь свой уровень логирования и форматтер.
  • Уровни логирования определяют, какие сообщения будут обработаны. Уровни от DEBUG до CRITICAL в порядке возрастания важности.
  • Форматтеры определяют, как сообщения будут отображаться.
  • В продакшене обычно используют более строгий уровень логирования для файла, например logging.WARNING или logging.ERROR, чтобы избежать переполнения лог-файла. В консоль можно выводить более подробную информацию во время разработки.
  • Для более сложной конфигурации можно использовать конфигурационные файлы (например, YAML или JSON) для определения параметров логирования. Это позволяет изменять конфигурацию без изменения кода. Модуль logging.config предоставляет инструменты для загрузки конфигурации из файлов.
0