Ведение журнала не входит все сценарии - PullRequest
0 голосов
/ 17 марта 2020

У меня есть проект, структурированный в несколько пакетов. Некоторые из них являются классами, другие просто имеют методы. Чтобы войти, у меня есть это в моем главном файле:

import logging
from logging.config import fileConfig

logging.getLogger('boto3').setLevel(logging.CRITICAL)
logging.getLogger('botocore').setLevel(logging.CRITICAL)
logging.getLogger('s3transfer').setLevel(logging.CRITICAL)

p = os.path.dirname(os.path.realpath(__file__))
fileConfig(f'{p}/logging.ini', defaults={'log_filename': "project.log"})

Где logging.ini определяется как:

[loggers]
keys=root

[handlers]
keys=fileHandler

[formatters]
keys=formatter

[logger_root]
level=DEBUG
handlers=fileHandler

[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
suffix="%Y-%m-%d.log"
formatter=formatter
args=('%(log_filename)s','midnight',1,5)

[formatter_formatter]
format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s
datefmt=

В моем главном файле я инициализирую класс с именем Pipeline, который импортировать несколько сценариев и имеет в своей инициализации:

self.logger = logging.getLogger(__name__)

В других модулях, которые не являются классами, я просто делаю:

logger = logging.getLogger(__name__)

def my_method():
    logger.info("Calling my_method()")

Что я не понимаю, так это почему для "простых" модулей журналы фактически не регистрируются. Однако, если я прокомментирую предыдущую строку и просто сделаю logging.info(...), я получу журналы для них с помощью клавиши root:

2020-03-17 16:35:36,072 core.pipeline INFO     _generate_trajectories_heat_map() called.
2020-03-17 16:35:36,337 root         INFO     Drawing image...
2020-03-17 16:35:37,178 root         INFO     Drawing velocities of vehicles...

Я пытаюсь найти то, что мне не хватает. Минимальный пример можно найти здесь:

https://drive.google.com/open?id=1bfGnikaCng_4N1rR05RYG2G2RcvsQoBP

Если вы запустите main.py, будет зарегистрирован только класс Pipeline. Если вы измените mypackage.py с того, что есть:

import logging

logger = logging.getLogger(__name__)

def method():
    logging.info("Logging method from package.")

Все будет зарегистрировано.

1 Ответ

0 голосов
/ 17 марта 2020

Из документации :

Функция fileConfig() принимает параметр по умолчанию disable_existing_loggers, который по умолчанию равен True в целях обратной совместимости. Это может или не может быть тем, что вы хотите, поскольку это приведет к отключению любых регистраторов, существующих до вызова fileConfig(), если только они (или предок) не указаны явно в конфигурации. Пожалуйста, обратитесь к справочной документации для получения дополнительной информации, и укажите False для этого параметра, если вы будете sh.

Итак, эта строка:

fileConfig(f'{p}/logging.ini', defaults={'log_filename': "mylog.log"},
       disable_existing_loggers=False)

должна исправить проблема.

...