У меня есть проект, структурированный в несколько пакетов. Некоторые из них являются классами, другие просто имеют методы. Чтобы войти, у меня есть это в моем главном файле:
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.")
Все будет зарегистрировано.