我的主脚本用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
的记录器?
答案 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的回答的评论表明已经在处理程序上设置了一个级别 - 这还不够,因为您需要在记录器上设置一个级别,其级别首先被检查。只有当事件被记录器的级别允许时,处理程序(及其级别)才会起作用。