Мультимодульный Python Logger, используя имя основного модуля - PullRequest
0 голосов
/ 16 октября 2018

У меня есть несколько модулей Python, которые я хотел бы использовать один и тот же регистратор, сохраняя при этом иерархию вызовов в этих журналах.Я также хотел бы сделать это с регистратором, имя которого является именем вызывающего модуля (или стека вызывающего модуля).Я не смог выяснить, как получить имя вызывающего модуля, кроме как возиться с трассировкой стека, но это не очень питонно.

Возможно ли это?

main.py

import logging
from sub_module import sub_log

logger = logging.getLogger(__name__)
logger.info("main_module")

sub_log()

sub_module.py

import logging

def sub_log():
    logger = logging.getLogger(???)
    logger.info("sub_module")

Желаемый вывод

TIME main INFO main_module
TIME main.sub_module INFO sub_module

1 Ответ

0 голосов
/ 16 октября 2018

Для решения проблемы Pythonic используйте Logger Formatter:

. Для справки проверьте подмодуль Logging

main.py

import logging
from submodule import sub_log
from submodule2 import sub_log2


logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s %(name)s.%(module)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(fh)

sub_log("test")
sub_log2("test")

.py

import logging
import __main__

def sub_log(msg):
    logger = logging.getLogger(__main__.__name__)
    logger.info(msg)

Я создал второй подмодуль.(тот же код другое имя)

Мои результаты:

2018-10-16 20:41:23,860 __main__.submodule - INFO - test
2018-10-16 20:41:23,860 __main__.submodule2 - INFO - test

Надеюсь, это поможет вам:)

...