Для многоканального логирования в Python:
logging.getLogger('название_модуля')
для каждого модуля/компонента.logging.StreamHandler
(консоль), logging.FileHandler
(файл), logging.RotatingFileHandler
(ротация файлов) и другие. Можно настроить разные форматтеры (Formatter) для каждого Handler.propagate=False
, чтобы избежать дублирования сообщений от корневого логгера, если это необходимо.Пример:
import logging
# Логгер для API
api_logger = logging.getLogger('api')
api_logger.setLevel(logging.DEBUG)
api_handler = logging.StreamHandler() # Вывод в консоль
api_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
api_logger.addHandler(api_handler)
# Логгер для базы данных
db_logger = logging.getLogger('db')
db_logger.setLevel(logging.WARNING)
db_file_handler = logging.FileHandler('db.log') # Запись в файл
db_file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
db_logger.addHandler(db_file_handler)
# Использование логгеров
api_logger.debug('Запрос получен')
db_logger.warning('Ошибка подключения к БД')
Многоканальное логирование в Python с использованием разных логгеров для различных частей приложения позволяет гибко управлять тем, как собираются и обрабатываются логи. Вот подробное описание настройки:
1. Импорт необходимых модулей:
import logging
import logging.config
2. Определение конфигурации логирования (обычно в файле logging.conf или logging.yaml):
Можно использовать файл конфигурации для централизованного управления логированием. Рассмотрим пример в YAML формате:
version: 1
formatters:
simple:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
file_app1:
class: logging.FileHandler
level: INFO
formatter: simple
filename: app1.log
file_app2:
class: logging.FileHandler
level: WARNING
formatter: simple
filename: app2.log
loggers:
app1:
level: INFO
handlers: [console, file_app1]
propagate: no # Предотвратить передачу логов в корневой логгер
app2:
level: WARNING
handlers: [file_app2]
propagate: no
root:
level: DEBUG
handlers: [console] #Пример корневого логгера, который пишет все в консоль
3. Загрузка конфигурации логирования:
Используйте `logging.config.dictConfig()` (если конфигурация представлена в виде словаря Python) или `logging.config.fileConfig()` (если конфигурация хранится в файле .ini) или `logging.config.dictConfig(yaml.safe_load(open('logging.yaml')))` (если используется YAML)
import yaml
with open('logging.yaml', 'r') as f:
config = yaml.safe_load(f)
logging.config.dictConfig(config)
4. Получение логгеров в разных частях приложения:
logger_app1 = logging.getLogger('app1')
logger_app2 = logging.getLogger('app2')
def some_function_in_app1():
logger_app1.info('This is an informational message from app1.')
def some_function_in_app2():
logger_app2.warning('This is a warning message from app2.')
5. Использование логгеров:
Теперь можно использовать полученные логгеры для записи сообщений в соответствующих частях приложения:
some_function_in_app1()
some_function_in_app2()
Объяснение ключевых моментов:
Преимущества такого подхода:
Дополнительные советы: