Python日志记录:为所用模块的所有记录器设置处理程序

时间:2013-12-05 05:46:28

标签: python logging

我的主脚本用argparse解释cli命令,然后通过从另一个模块调用相应的东西来启动应用程序(由我自己制作)。

我现在的问题是如何将处理程序从该模块附加到记录器。使用

检索记录器
logger = logging.getLogger(__name__)

因此,我在主脚本中加入了以下内容:

consoleHandler = logging.StreamHandler()
logger = logging.getLogger('MyModule')
logger.addHandler(consoleHandler)

但是'MyModule'有0个日志输出。日志级别是正确的,例如应该有输出。

MyModule我有以下内容:

logging.getLogger(__name__).addHandler(logging.NullHandler())

然而,删除它没有任何区别。

那么我怎样才能正确地将处理程序附加到MyModule的记录器?

2 个答案:

答案 0 :(得分:2)

handler添加到记录器的最佳示例是来自Docs的示例,请参见下文。

您是否添加了consoleHandler setLevel()Formatter()

至于这一行: logging.getLogger(__name__).addHandler(logging.NullHandler())

你为什么用这种方式?我建议按照下一个代码以正确的方式添加处理程序。

import logging

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

答案 1 :(得分:1)

您没有输出的原因很可能是您没有在记录器上设置级别,因此默认为WARNING。尝试执行logger.setLevel(logging.DEBUG)并查看是否会导致生成输出。我知道你说日志级别是正确的,但我看不出任何其他原因导致没有输出。如果您愿意,可以尝试发布一个演示问题的小型自包含脚本。

只需要为库模块添加

NullHandler,以满足它们在不配置日志记录的应用程序中的使用。在配置日志记录的应用程序模块中不需要它。

通常,您可以向根记录器添加处理程序,并且记录器将在所有模块中使用它。

更新:对Kobi K的回答的评论表明已经在处理程序上设置了一个级别 - 这还不够,因为您需要在记录器上设置一个级别,其级别首先被检查。只有当事件被记录器的级别允许时,处理程序(及其级别)才会起作用。