Python:警告和日志详细限制
我想把我应用里的日志记录功能统一起来。每当有警告出现时,我就会抛出一个异常,然后捕获这个异常并把它传给日志记录器。但是我有个问题:在日志记录中有没有静音的功能?有时候日志记录的信息太多了,警告信息也会太吵。有没有办法限制警告信息的数量呢?
3 个回答
来自你提到的那个来源。这里有日志级别,记得聪明地使用它们哦;-)
LEVELS = {'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'critical': logging.CRITICAL}
如果你打算从一个不知道具体代码的错误处理程序中进行所有的日志记录调用,这就会成为一个问题,这听起来正是你提问的意思。你怎么决定哪些日志记录调用要执行,哪些不执行呢?
更标准的做法是,尽量在可能的情况下进行恢复,并记录一个错误(实际上,如果这是一个你没有特别准备的错误,你是希望知道的;可以使用较高的级别)。但是,不要完全依赖这些错误处理块来获取所有的状态或调试信息。最好是在代码中适当地添加日志记录调用,这样在到达错误处理程序之前,你就能收集到有用的信息。这样,你可以在系统没有出现故障时观察到有用的运行时信息,并且可以记录不同严重程度的日志。例如:
import logging
from traceback import format_exc
logger = logging.getLogger() # Gives the root logger. Change this for better organization
# Add your appenders or what have you
def handle_error(e):
logger.error("Unexpected error found")
logger.warn(format_exc()) #put the traceback in the log at lower level
... #Your recovery code
def do_stuff():
logger.info("Program started")
... #Your main code
logger.info("Stuff done")
if __name__ == "__main__":
try:
do_stuff()
except Exception,e:
handle_error(e)
不仅有日志级别,还有一种非常灵活的配置方式。如果你在使用命名的logger
对象(比如logger = logging.getLogger(...)
),那么你可以根据需要进行配置。这样,你就可以对每个子系统单独设置日志的详细程度,其中子系统是通过日志层级来定义的。
另一种选择是使用logging.Filter
和警告过滤器来限制输出。我之前没有用过这种方法,但看起来可能更适合你的需求。
可以看看PEP-282,里面对Python的logging
包有很好的文字描述。我觉得它比模块文档描述得更清楚。
澄清后的编辑
你可以考虑使用基于logging.Logger
的自定义类来处理日志部分,并通过logging.setLoggerClass()
进行注册。听起来你想要的功能类似于系统日志中的"最后一条消息重复了9次"。不幸的是,我不知道哪里有这样的实现。你可以看看twisted.python.log是否支持这个功能。