我正在努力加强Python脚本中的日志记录,如果能够与我分享最佳实践,我将非常感激。现在,我已经创建了这个小脚本(应该说我运行Python3.4)
import logging
import io
import sys
def Streamhandler(stream, level, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"):
ch = logging.StreamHandler(stream)
ch.setLevel(level)
formatter = logging.Formatter(format)
ch.setFormatter(formatter)
return ch
# get the root logger
logger = logging.getLogger()
stream = io.StringIO()
logger.addHandler(Streamhandler(stream, logging.WARN))
stream_error = io.StringIO()
logger.addHandler(Streamhandler(stream_error, logging.ERROR))
logger.addHandler(Streamhandler(stream=sys.stdout, level=logging.DEBUG))
print(logger)
for h in logger.handlers:
print(h)
print(h.level)
# 'application' code # goes to the root logger!
logging.debug('debug message')
logging.info('info message')
logging.warning('warn message')
logging.error('error message')
logging.critical('critical message')
print(stream.getvalue())
print(stream_error.getvalue())我有三个处理程序,其中两个写进了一个io.StringIO (这似乎有效)。我需要这简化测试,但也通过HTTP电子邮件服务发送日志。然后有一个用于控制台的Stream处理程序。然而,在这里,logging.debug和logging.info消息在控制台上被忽略,尽管设置的级别显式地足够低?!
发布于 2015-06-25 11:26:17
首先,您没有在记录器本身上设置级别:
logger.setLevel(logging.DEBUG)此外,您还定义了一个logger,但是对logging进行了调用--这将调用根记录器。这并不会对您的情况产生任何影响,因为您没有为您的记录器指定名称,因此logging.getLogger()返回根记录器。
wrt/“最佳实践”,这确实取决于您的脚本有多“复杂”,当然也取决于您的日志记录需求。
对于具有简单用例的自包含简单脚本(单个已知环境、不并发执行、对文件或stderr进行简单日志记录等),对logging.basicConfig()的简单调用和对logging.whatever()的直接调用通常都足够好。
对于更复杂的内容,最好使用不同的配置文件--无论是ini格式还是Python (使用logging.dictConfig),将脚本拆分为不同的模块或包,每个模块或包定义自己的名为记录器(带有logger = logging.getLogger(__name__)),并且只保留脚本本身作为代码的“运行者”,即:配置日志记录、导入模块、解析命令行args和调用主函数--最好是在try/except块中,以便在崩溃前正确地记录任何未处理的异常。
发布于 2015-06-25 11:26:08
logger也有一个阈值级,您需要首先将它设置为DEBUG:
logger.setLevel(logging.DEBUG)https://stackoverflow.com/questions/31048748
复制相似问题