我有一个核心python库(通过它我只读取访问权限)。这个核心库有以下语句(注意:日志设置为NullHandler)
logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())在一些地方,核心库也有记录信息级别消息的语句,例如,
logger.info("In test1")过了一段时间,
logger.info("In test2") 我正在尝试使用python客户机从核心库中提取日志。在python客户机中,我添加以下语句:
import logging
logger = logging.getLogger('myapp')
hdlr = logging.FileHandler('temp.log')
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)但是,这只会记录本地的信息级消息到我的客户端脚本。
问:有什么方法可以让我的客户从核心库中提取日志吗?
发布于 2018-06-15 07:48:15
您需要在core中定义记录器。
$ 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..
$发布于 2018-06-15 06:34:04
参见此处关于记录器名称如何工作的讨论:https://docs.python.org/2/library/logging.html#logger-objects
只有当库的记录器从您的“myapp”记录器继承时,您的logging.getLogger('myapp')才会看到库的日志。因为它被命名为__name__,所以我认为只有当库是应用程序的子模块(即它位于应用程序下的子文件夹中)时,这才是正确的。不过,我对导入的理解可能是错误的;我还没有在核心模块中实际测试__name__解析的内容。
通常,您需要知道库的记录器的字符串名称(在本例中,无论__name__解析到什么),然后调用getLogger来获取它。但在特定情况下,您可以从库中的任何模块导入记录器对象。然后将处理程序添加到其中。
发布于 2018-06-15 07:10:15
日志模块有一个管理器,可以跟踪所有现有的记录器。您可以迭代它并将处理程序添加到所有记录器中,如下所示:
logger = logging.getLogger(__name__)
hdlr = logging.FileHandler("temp.log")
for logr in logging.Logger.manager.loggerDict.values():
logr.addHandler(hdlr)
logr.setLevel(logging.INFO)当然,这必须在创建了核心模块的记录器之后完成。它需要核心库在与客户端相同的进程中运行。
https://stackoverflow.com/questions/50869663
复制相似问题