我有一个核心python库(我只读访问权限)。 此核心库具有以下语句(注意:日志记录设置为NullHandler)
logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())
在核心库中,核心库也有用于记录INFO级别消息的语句,例如,
logger.info("In test1")
稍后,
logger.info("In test2")
我正在尝试使用我的python客户端从核心lib中提取日志。在python客户端中,我添加了以下语句:
import logging
logger = logging.getLogger('myapp')
hdlr = logging.FileHandler('temp.log')
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
但是,这只会将INFO级别的消息 本地记录到我的客户端脚本 。
Que:有没有办法调整我的客户端从核心库中提取日志?
答案 0 :(得分:1)
请参阅此处有关记录器名称如何工作的讨论: https://docs.python.org/2/library/logging.html#logger-objects
如果图书馆的记录器继承自您的“我的应用”,那么您的logging.getLogger('myapp')
只会看到图书馆的日志。记录仪。由于它的名称为__name__
,我认为只有在您的应用程序的子模块(即它位于您应用程序下的子文件夹中)时才会出现这种情况。我对进口的理解可能是错误的;我还没有真正测试__name__
在核心模块中解析的内容。
通常,您需要知道库的记录器的字符串名称(在这种情况下,无论__name__
解析为什么。),然后调用getLogger来获取它。但在您的特定情况下,您只需从库中的任何模块导入记录器对象。然后将处理程序添加到它。
答案 1 :(得分:1)
日志记录模块有一个跟踪所有现有记录器的管理器。 您可以遍历它并将处理程序添加到所有记录器,如下所示:
logger = logging.getLogger(__name__)
hdlr = logging.FileHandler("temp.log")
for logr in logging.Logger.manager.loggerDict.values():
logr.addHandler(hdlr)
logr.setLevel(logging.INFO)
当然,这必须在创建核心模块的记录器之后完成。它需要核心库在与客户端相同的过程中运行。
答案 2 :(得分:1)
您需要在核心中定义记录器。
$ cat core.py
import logging
logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())
def core_fn():
logger.info("I'm in core..")
$ cat client.py
import logging
import core
if __name__ == '__main__':
#logger = logging.getLogger('myapp')
logger = logging.getLogger(__name__)
hdlr = logging.FileHandler('temp.log')
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
logger.info("I'm in client")
logger2 = logging.getLogger('core')
logger2.addHandler(hdlr)
logger2.setLevel(logging.INFO)
core.core_fn()
$ python client.py
$ cat temp.log
I'm in client
I'm in core..
$