Python日志记录基础

时间:2018-06-15 05:39:16

标签: python logging

我有一个核心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:有没有办法调整我的客户端从核心库中提取日志?

3 个答案:

答案 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..
$