从库模块记录Python

Bru*_*ort 6 python logging

我试图在我的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")
Run Code Online (Sandbox Code Playgroud)

我已经在libmodule.py中尝试过:

import logging

def say(msg):
    logging.info(msg)
Run Code Online (Sandbox Code Playgroud)

和这个:

import logging
logger = logging.getLogger()

def say(msg):
    logger.info(msg)
Run Code Online (Sandbox Code Playgroud)

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

[callingmodule] INFO message from calling module
Run Code Online (Sandbox Code Playgroud)

但是期望这样:

[callingmodule] INFO message from calling module
[callingmodule] INFO message from library module
Run Code Online (Sandbox Code Playgroud)

Cor*_*man 7

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

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

'多次调用具有相同名称的 getLogger() 将始终返回对同一个 Logger 对象的引用。

换句话说,如果你只是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)
Run Code Online (Sandbox Code Playgroud)

然后在您的父模块中:

# In the parent module
mylog = a logger i set up

import libmodule
libmodule.initLogger(mylog)
Run Code Online (Sandbox Code Playgroud)

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