Python отдельная конфигурация журналирования для модуля - PullRequest
0 голосов
/ 17 июня 2020

Предположим, у меня есть такая конфигурация ведения журнала (любезно предоставлена ​​https://gist.github.com/kingspp/9451566a5555fb022215ca2b7b802f19):

version: 1
disable_existing_loggers: true

formatters:
    standard:
        format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    error:
        format: "%(levelname)s <PID %(process)d:%(processName)s> %(name)s.%(funcName)s(): %(message)s"

handlers:
    console:
        class: logging.StreamHandler
        level: DEBUG
        formatter: standard
        stream: ext://sys.stdout

    info_file_handler:
        class: logging.handlers.RotatingFileHandler
        level: INFO
        formatter: standard
        filename: logs/info.log
        maxBytes: 10485760 # 10MB
        backupCount: 20
        encoding: utf8

    error_file_handler:
        class: logging.handlers.RotatingFileHandler
        level: ERROR
        formatter: error
        filename: logs/errors.log
        maxBytes: 10485760 # 10MB
        backupCount: 20
        encoding: utf8

    debug_file_handler:
        class: logging.handlers.RotatingFileHandler
        level: DEBUG
        formatter: standard
        filename: logs/debug.log
        maxBytes: 10485760 # 10MB
        backupCount: 20
        encoding: utf8

    critical_file_handler:
        class: logging.handlers.RotatingFileHandler
        level: CRITICAL
        formatter: standard
        filename: logs/critical.log
        maxBytes: 10485760 # 10MB
        backupCount: 20
        encoding: utf8

    warn_file_handler:
        class: logging.handlers.RotatingFileHandler
        level: WARN
        formatter: standard
        filename: logs/warn.log
        maxBytes: 10485760 # 10MB
        backupCount: 20
        encoding: utf8

loggers:
    src.b:
        level: INFO
        handlers: [console]
        propogate: no

root:
    level: DEBUG
    handlers: [info_file_handler, error_file_handler, critical_file_handler, debug_file_handler, warn_file_handler]
    propogate: no

И у меня следующая файловая структура:

|config
|-logging_config.yaml
|src
|-b.py
|a.py
|logs

Файлы следующие. a.py:

import logging
import logging.config
import yaml

with open('config/logging_config.yaml', 'r') as f:
    config = yaml.safe_load(f.read())
    logging.config.dictConfig(config)

import src.b

if __name__ == "__main__":
    # Sample logs from main 
    logging.debug("A Debug log")
    logging.info("A Info log")
    logging.warning("A Warning log")
    logging.error("A Error log")
    logging.critical("A Critical log ")

b.py

import logging

logger = logging.getLogger(__name__)
print(__name__)
print(logger)

logging.debug("B Debug log")
logging.info("B Info log")
logging.warning("B Warning log")
logging.error("B Error log")
logging.critical("B Critical log ")

После запуска

python a.py

Я ожидаю, что в файлах будут журналы из a.py (поскольку используется регистратор root) и ведение журнала из b.py в консоли, поскольку используется регистратор sr c .b и для параметра распространения задано значение no. Однако все находится в файлах журнала и ничего не поступает на консоль. Когда я реверсирую это, я получаю все в консоли и ничего в файлах журнала. Не могли бы вы помочь мне перенести журналы из b в консоль (только) и журналы из a только в файлы?

...