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('Это критическая ошибка')
  Настроить несколько обработчиков для записи логов в разные места можно с помощью модуля 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() создают записи в логе с соответствующими уровнями.Ключевые моменты:
logging.WARNING или logging.ERROR, чтобы избежать переполнения лог-файла. В консоль можно выводить более подробную информацию во время разработки.logging.config предоставляет инструменты для загрузки конфигурации из файлов.