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

时间:2016-02-02 11:39:33

标签: 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)

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

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

2 个答案:

答案 0 :(得分:9)

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

所有文件操作(日志发送,轮换等)都使用try..except Exception块进行保护。如果发生异常,logging.Handler.handeError() method会将异常写入sys.stderr。您可以将logging.raiseExceptions设置为False以使其静音:

import logging

logging.raiseExceptions = False

引用文档:

  

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

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

handler = logging.handlers.RotatingFileHandler(
    LOG_FILENAME, maxBytes=20, backupCount=5, delay=True)

您使用的内容可归结为是否在LOG_FILENAME中提供错误的路径是否是应用程序错误。

答案 1 :(得分:1)

因此,在您编辑后,这不是真的有效。

您可以使用try - except方法

示例:

try:
    file_handler =open("not_a_file_for_sure","r")
except IOError:
    print "File not found"

您可以except出现任何类型的错误,甚至是所有错误,但不建议这样做。

如果你不关心它,只需except你得到的错误和continuepass