首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python日志记录基础

Python日志记录基础
EN

Stack Overflow用户
提问于 2018-06-15 05:39:15
回答 3查看 174关注 0票数 0

我有一个核心python库(通过它我只读取访问权限)。这个核心库有以下语句(注意:日志设置为NullHandler)

代码语言:javascript
复制
logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

在一些地方,核心库也有记录信息级别消息的语句,例如,

代码语言:javascript
复制
logger.info("In test1")

过了一段时间,

代码语言:javascript
复制
logger.info("In test2")                

我正在尝试使用python客户机从核心库中提取日志。在python客户机中,我添加以下语句:

代码语言:javascript
复制
import logging
logger = logging.getLogger('myapp')
hdlr = logging.FileHandler('temp.log')
logger.addHandler(hdlr) 
logger.setLevel(logging.INFO)

但是,这只会记录本地的信息级消息到我的客户端脚本

问:有什么方法可以让我的客户从核心库中提取日志吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-15 07:48:15

您需要在core中定义记录器。

代码语言:javascript
复制
$ 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..
$
票数 1
EN

Stack Overflow用户

发布于 2018-06-15 06:34:04

参见此处关于记录器名称如何工作的讨论:https://docs.python.org/2/library/logging.html#logger-objects

只有当库的记录器从您的“myapp”记录器继承时,您的logging.getLogger('myapp')才会看到库的日志。因为它被命名为__name__,所以我认为只有当库是应用程序的子模块(即它位于应用程序下的子文件夹中)时,这才是正确的。不过,我对导入的理解可能是错误的;我还没有在核心模块中实际测试__name__解析的内容。

通常,您需要知道库的记录器的字符串名称(在本例中,无论__name__解析到什么),然后调用getLogger来获取它。但在特定情况下,您可以从库中的任何模块导入记录器对象。然后将处理程序添加到其中。

票数 1
EN

Stack Overflow用户

发布于 2018-06-15 07:10:15

日志模块有一个管理器,可以跟踪所有现有的记录器。您可以迭代它并将处理程序添加到所有记录器中,如下所示:

代码语言:javascript
复制
logger = logging.getLogger(__name__)
hdlr = logging.FileHandler("temp.log")


for logr in logging.Logger.manager.loggerDict.values():
    logr.addHandler(hdlr)
    logr.setLevel(logging.INFO)

当然,这必须在创建了核心模块的记录器之后完成。它需要核心库在与客户端相同的进程中运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50869663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档