logging и его класс logging.Formatter.
  formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    Полный пример:
  
  import logging
  # Настройка логгера
  logger = logging.getLogger('my_logger')
  logger.setLevel(logging.DEBUG)
  # Создание обработчика (handler) - вывод в консоль
  handler = logging.StreamHandler()
  # Создание форматтера
  formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  # Установка форматтера для обработчика
  handler.setFormatter(formatter)
  # Добавление обработчика к логгеру
  logger.addHandler(handler)
  # Логирование
  logger.debug('Отладочное сообщение')
  logger.info('Информационное сообщение')
  logger.warning('Предупреждение')
  logger.error('Ошибка')
  logger.critical('Критическая ошибка')
  
  
Чтобы установить собственный формат для записи логов в Python, необходимо воспользоваться модулем logging и сконфигурировать его, используя объекты Formatter.
Основные шаги:
logging:
      import loggingFormatter, указав желаемый формат:
      Формат задается строкой, использующей специальные символы, такие как:
%(asctime)s: Дата и время записи.%(levelname)s: Уровень логирования (DEBUG, INFO, WARNING, ERROR, CRITICAL).%(name)s: Имя логгера.%(message)s: Сообщение, которое необходимо записать в лог.%(filename)s: Имя файла, из которого была вызвана запись в лог.%(lineno)d: Номер строки, из которой была вызвана запись в лог.%(funcName)s: Имя функции, из которой была вызвана запись в лог.formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')В этом примере, формат лог-сообщения будет следующим: Дата и время - Имя логгера - Уровень - Сообщение
Handler), который будет записывать логи:
      Существует несколько типов обработчиков, например:
logging.StreamHandler: Выводит логи в консоль.logging.FileHandler: Записывает логи в файл.handler = logging.StreamHandler()  # Для вывода в консоль
# или
# handler = logging.FileHandler('my_app.log')  # Для записи в файлhandler.setFormatter(formatter)logger = logging.getLogger('my_logger')Например, logging.INFO будет записывать сообщения уровней INFO, WARNING, ERROR и CRITICAL.
logger.setLevel(logging.INFO)logger.addHandler(handler)logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')Пример полного кода:
import logging
# 1. Создаем объект Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 2. Создаем обработчик (например, для вывода в консоль)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
# 3. Получаем логгер
logger = logging.getLogger('my_app')
logger.setLevel(logging.INFO)  # Устанавливаем уровень логирования
# 4. Добавляем обработчик к логгеру
logger.addHandler(handler)
# 5. Используем логгер
logger.info('Application started')
logger.warning('Low memory detected')
logger.error('Database connection failed')
Дополнительные возможности:
logging.config.  Это полезно для более сложной конфигурации и позволяет изменять логирование без изменения кода.logging.handlers.RotatingFileHandler или logging.handlers.TimedRotatingFileHandler для автоматической ротации лог-файлов и предотвращения их разрастания.