库modu的Python日志记录

2024-10-02 02:28:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在Python库模块中设置通用日志,以便它们使用在调用模块中配置的记录器,而不必硬编码记录器名称。我见过很多在调用模块中使用logging.basicConfig()和在库模块中调用logging.debug()的例子,但是当我配置自己的StreamHandler时,它就不起作用了。我做错什么了?在

这是我的呼叫模块:

import logging, logging.handlers
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
consolehandler = logging.StreamHandler()
consoleformatter = logging.Formatter('[%(name)s] %(levelname)s %(message)s')
consolehandler.setFormatter(consoleformatter)
logger.addHandler(consolehandler)
import libmodule

def run():
    logger.info("message from calling module")
    libmodule.say("message from library module")

我试过了libmodule.py公司名称:

^{pr2}$

还有这个:

import logging
logger = logging.getLogger()

def say(msg):
    logger.info(msg)

但在这两种情况下,当我调用run()时,都会得到以下输出:

[callingmodule] INFO message from calling module

但我们期待的是:

[callingmodule] INFO message from calling module
[callingmodule] INFO message from library module

Tags: 模块fromimportinfo名称messagelogginglogger
1条回答
网友
1楼 · 发布于 2024-10-02 02:28:59

这是因为在第一个实例中,您按名称获取一个记录器,而在第二个实例中,您只需使用getLogger(),它返回根记录器。它不是同一个,并且没有安装自定义流处理程序。在

更简单的方法是遵循文档here中的指导:

'Multiple calls to getLogger() with the same name will always return a reference to the same Logger object.'

换句话说,如果您在两个地方都使用getLogger('my_common_name'),那么它们都将自动指向同一个记录器,即使您在一个地方对其进行了自定义。在

添加:如果要从父级捕获记录器,则应在库中执行以下操作:

# In libmodule

_log = None

def initLogger(logger=None):
    global _log
    if logger != None:
        _log = logger
    else:
        import logging
        _log = logging.getLogger()

# Later in the module
def say(message):
    _log.info(message)

然后在父模块中:

^{pr2}$

这应该使它们都指向同一个记录器。在

相关问题 更多 >

    热门问题