Как можно логировать сообщения с различными уровнями важности в одном приложении?

Использовать модуль logging. Настроить разные обработчики (handlers) и форматтеры (formatters) для вывода логов разного уровня (DEBUG, INFO, WARNING, ERROR, CRITICAL) в разные места (файл, консоль, внешняя система). Каждому обработчику можно установить свой уровень логирования, например, в файл писать все логи начиная с INFO, а в консоль только ERROR и CRITICAL. Также можно использовать разные форматтеры для разного представления сообщений.

Для логирования сообщений с различными уровнями важности в Python приложении можно использовать модуль logging, который предоставляет гибкий и мощный механизм для этой цели. Вот как это можно сделать:

  1. Импорт модуля logging:

    В начале вашего скрипта импортируйте модуль:

    import logging
  2. Настройка логгера:

    Создайте логгер и настройте его уровень логирования. Уровень логирования определяет, какие сообщения будут записаны в лог. Доступные уровни (по возрастанию важности): DEBUG, INFO, WARNING, ERROR, CRITICAL.

    # Получаем логгер
    logger = logging.getLogger(__name__)
    
    # Устанавливаем уровень логирования.  Например, логируем все, что выше DEBUG.
    logger.setLevel(logging.DEBUG)
    
  3. Создание обработчика (Handler):

    Обработчик определяет, куда будут записываться логи. Наиболее распространенные варианты – файл или консоль. Можно использовать несколько обработчиков одновременно.

    # Создаем обработчик для записи в файл
    file_handler = logging.FileHandler('app.log')
    
    # Создаем обработчик для вывода в консоль
    stream_handler = logging.StreamHandler()
    
  4. Форматирование логов (Formatter):

    Форматировщик определяет, как будут выглядеть ваши логи. Вы можете указать формат времени, уровень логирования, имя модуля и само сообщение.

    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    file_handler.setFormatter(formatter)
    stream_handler.setFormatter(formatter)
    
  5. Добавление обработчиков к логгеру:

    Привязываем созданные обработчики к нашему логгеру.

    logger.addHandler(file_handler)
    logger.addHandler(stream_handler)
    
  6. Использование логгера:

    Теперь вы можете использовать логгер для записи сообщений с разными уровнями важности:

    logger.debug('Сообщение уровня DEBUG')
    logger.info('Сообщение уровня INFO')
    logger.warning('Сообщение уровня WARNING')
    logger.error('Сообщение уровня ERROR')
    logger.critical('Сообщение уровня CRITICAL')
    

Полный пример:

import logging

# Настройка логгера
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

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

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

# Форматирование логов
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)

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

# Использование логгера
def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        logger.exception("Деление на ноль!") # Логируем исключение
    else:
        logger.info(f"Результат деления {x} на {y}: {result}")
        return result

divide(10, 2)
divide(10, 0)


logger.debug('Это сообщение отладки')
logger.info('Это информационное сообщение')
logger.warning('Это предупреждающее сообщение')
logger.error('Это сообщение об ошибке')
logger.critical('Это критическое сообщение')

Дополнительные возможности:

  • Можно создавать несколько логгеров для разных частей приложения.
  • Можно использовать разные обработчики для разных уровней логирования (например, ошибки записывать в отдельный файл).
  • Можно использовать конфигурационные файлы для настройки логирования, что позволяет изменять настройки без изменения кода.
  • Модуль logging поддерживает ротацию лог-файлов (например, создание нового файла каждый день или при достижении определенного размера).

Таким образом, модуль logging предоставляет все необходимые инструменты для гибкого и эффективного логирования в Python приложениях.

0