处理并重新引发python日志记录模块抛出的异常

时间:2014-07-07 16:01:26

标签: python python-2.7 exception logging handler

问题

如何为python logging记录器编写一个自定义处理程序,该记录器将捕获由于突然无法将日志记录信息写入文件并将错误重新引发为另一种类型而导致的IOError

更多信息

我正在阅读和转换大型原始数据存储库,记录流程(python logging模块)对我来说非常重要。如果由于某些错误而导致记录失败,例如IOError,我希望应用程序优雅地退出。在周末,我编写日志文件的网络位置崩溃,转换过程继续游戏。

我的代码中的其他组件可能会抛出IOError(例如,在给定时间内转换的原始文件不存在,表明检测器在给定的时间段内已关闭)并不重要并且可以忽略。我发现了这些错误并继续下一小时的数据。

如果记录器抛出了不同的自定义异常,我可以单独处理它。像(免责声明:这不起作用):

class WarningFileHandler(logging.FileHandler):
    """File handler for only writing WARNING log information to disk"""

    def __init__(self,filename,mode='a',encoding=None,delay=False):
        logging.FileHandler.__init__(self, filename, mode, encoding, delay)

    def emit(self, record):
        # Filter out all record objects that are not at the logging.WARNING level.
        if not record.levelno == logging.WARNING:
            return
        try:
            logging.FileHandler.emit(self, record)
        except IOError as e:
            # The logger cannot write successfully to disk (e.g. a network
            # resource becomes unavailable).
            raise LoggerIOError("[ERROR NO {0}: {1}]. Logger write "
                    "failure.".format(e.errno,e.strerror))

LoggerIOError是一个简单的自定义异常。

class LoggerIOError(Exception):
    """Logger IOError"""
    pass

任何人都可以提供一些帮助或建议吗?我对logging模块没有多少经验,所以我可能会忽略一些简单的事情。

logging.raiseExceptions的默认值应为True

详细信息

OS / Python详细信息:

  • Windows 7
  • Python 2.7

谢谢!

1 个答案:

答案 0 :(得分:3)

异常由处理程序的handleError方法处理,记录为here。子类化相关处理程序以实现自定义错误处理。从{exception}子句调用handleError方法,因此sys.exc_info()应返回当前异常。