如何忽略在python中记录期间生成的异常?

Sha*_*dit 4 python logging

我正在一个大的python模块(Python 2.6.6)工作,并在数千个地方进行日志记录,我正在使用python的logger模块.现在,我想忽略在日志记录期间生成的异常.可能的基本方案之一是

import glob
import logging
import logging.handlers

LOG_FILENAME = '/home/abc/logging_rotatingfile_example.out'
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
              LOG_FILENAME, maxBytes=20, backupCount=5)
my_logger.addHandler(handler)
# Log some messages
for i in range(20):
    my_logger.debug('i = %d' % i)
Run Code Online (Sandbox Code Playgroud)

现在假设,在my_logger.debug('i = %d' % i)某些过程中,如何从系统中删除文件或权限被更改,并且记录器无法记录日志文件中的磁盘故障,磁盘已满等,并在屏幕上生成异常.它是分布式系统,n个进程都使用记录器模块.请注意,由于记录异常(由于磁盘故障,磁盘已满等),不应中止进程.所以我希望忽略该异常.

注意:现在我知道在python logger上创建包装器类并使用try-except作为记录器函数的方法之一.但我有不同的要求,我不想这样使用,有没有其他方法来做这个或python logger的任何属性,这对我的条件有用?

Mar*_*ers 10

您不需要忽略异常,因为logging模块已经为您处理了这些异常.

所有文件操作(日志发送,旋转等)都使用try..except Exception块进行保护.如果发生异常,则该logging.Handler.handeError()方法将编写异常sys.stderr.您可以设置logging.raiseExceptionsFalse沉默这些:

import logging

logging.raiseExceptions = False
Run Code Online (Sandbox Code Playgroud)

引用文档:

emit()调用期间遇到异常时,应从处理程序调用此方法.如果是模块级属性,raiseExceptions则会以False静默方式忽略异常.这是日志记录系统最需要的 - 大多数用户不关心日志记录系统中的错误,他们对应用程序错误更感兴趣.但是,如果您愿意,可以使用自定义处理程序替换它.指定的记录是发生异常时正在处理的记录.(的默认值raiseExceptionsTrue,因为这在开发过程中是比较有用的).

如果RotatingFileHandler无法创建传递给的文件名,则在记录期间不会发生引发的异常,但会在创建处理程序时发生.您要么必须在那里处理该异常,要么delay=True在创建处理程序时设置为推迟打开文件直到记录时间:

handler = logging.handlers.RotatingFileHandler(
    LOG_FILENAME, maxBytes=20, backupCount=5, delay=True)
Run Code Online (Sandbox Code Playgroud)

你使用的是什么,或者你没有看到提供错误的路径LOG_FILENAME是一个应用程序错误或不在那一点.