Как использовать `logging.getLogger()` для создания разных логгеров?

Для создания разных логгеров используйте logging.getLogger("имя_логгера"). Каждый вызов с уникальным именем возвращает новый логгер или, если он уже существует, существующий. Это позволяет конфигурировать логирование для разных частей приложения независимо.

Использование logging.getLogger() – это основной способ создания и получения экземпляров логгеров в Python. Ключевая особенность заключается в том, что logging.getLogger(name) возвращает один и тот же экземпляр логгера, если вызвать его несколько раз с одним и тем же именем. Это позволяет организовывать иерархическую структуру логгеров и настраивать их независимо друг от друга.

Вот как можно использовать logging.getLogger() для создания разных логгеров:

  1. Создание логгеров с разными именами:

    Каждый вызов logging.getLogger() с уникальным именем создает (или возвращает существующий) логгер с этим именем. Имя логгера обычно отражает модуль или компонент, в котором он используется.

    
    import logging
    
    # Получаем логгер для модуля "module_a"
    logger_a = logging.getLogger("module_a")
    
    # Получаем логгер для модуля "module_b"
    logger_b = logging.getLogger("module_b")
    
    logger_a.setLevel(logging.DEBUG)
    logger_b.setLevel(logging.INFO)
    
    logger_a.debug("Сообщение от module_a (DEBUG)")
    logger_a.info("Сообщение от module_a (INFO)")
    
    logger_b.debug("Сообщение от module_b (DEBUG) - Не отобразится, т.к. уровень INFO")
    logger_b.info("Сообщение от module_b (INFO)")
          

    В этом примере создаются два логгера: module_a и module_b. Каждый логгер может иметь свой уровень логирования и обработчики. Важно, что повторный вызов logging.getLogger("module_a") вернет тот же самый объект логгера, созданный ранее.

  2. Иерархическая структура логгеров:

    Имена логгеров могут образовывать иерархию, разделенную точками (.). Например, "myapp.module_a" является потомком логгера "myapp". Настройки логгеров применяются ко всем его потомкам, если только они не переопределены на уровне потомка.

    
    import logging
    
    # Создаем корневой логгер "myapp"
    logger_myapp = logging.getLogger("myapp")
    logger_myapp.setLevel(logging.DEBUG)
    
    # Создаем логгер "myapp.module_a"
    logger_module_a = logging.getLogger("myapp.module_a")
    
    # Создаем логгер "myapp.module_b"
    logger_module_b = logging.getLogger("myapp.module_b")
    
    # Добавляем обработчик для корневого логгера (вывод в консоль)
    handler = logging.StreamHandler()
    handler.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger_myapp.addHandler(handler)
    
    
    logger_myapp.debug("Сообщение от myapp")
    logger_module_a.debug("Сообщение от myapp.module_a")  # Отобразится, т.к. унаследовал уровень DEBUG от myapp
    logger_module_b.info("Сообщение от myapp.module_b")   # Отобразится, т.к. унаследовал уровень DEBUG от myapp, но сам выводит INFO
          

    В этом примере, если для logger_myapp установлен уровень логирования DEBUG, то по умолчанию этот уровень будет унаследован логгерами logger_module_a и logger_module_b. Однако, каждый из дочерних логгеров может переопределить свои собственные уровни или обработчики, если это необходимо.

  3. Преимущества использования именованных логгеров:
    • Организация кода: Позволяет четко определить, откуда исходит каждое сообщение журнала.
    • Гибкая настройка: Возможность настройки логирования для отдельных модулей или компонентов приложения.
    • Удобство отладки: Облегчает поиск и устранение проблем, связанных с конкретным модулем или компонентом.

Важно: При использовании logging.getLogger() всегда следует указывать осмысленные имена для логгеров, отражающие структуру вашего приложения. Часто, в качестве имени логгера используют __name__ текущего модуля.


import logging

# Получаем логгер с именем текущего модуля
logger = logging.getLogger(__name__)

logger.debug("Сообщение из модуля my_module")
  
0