记录,在文件翻转时处理丢失的日志文件

时间:2013-09-04 16:41:27

标签: python logging

有人无意中移动了python程序使用的打开日志文件。 该程序使用带有TimedRotatingFileHandler的日志记录模块。当翻转文件的时候输出了这个错误:

Traceback (most recent call last):
File "/python_root/lib/logging/handlers.py", line 78, in emit
    self.doRollover()
  File "/python_root/lib/logging/handlers.py", line 338, in doRollover
    os.rename(self.baseFilename, dfn)
OSError: [Errno 2] no such file or directory
Logged from file logtest.py, line 16

每次后续尝试记录某些内容时都会重复该错误。记录的消息没有进入旧的(移动的)日志文件。

这会重现问题(如果您移动日志文件:))

import time
import logging
from logging import handlers

f = logging.Formatter( "%(asctime)s %(message)s" )
h = handlers.TimedRotatingFileHandler(
      "testlog", when='s', interval=5, backupCount=10 )
h.setFormatter( f )
logger = logging.getLogger( 'test' )
logger.setLevel( logging.INFO )
logger.addHandler( h )
logger.info( "LOGTEST started" )
for i in range( 10 ):
    time.sleep( 5 )
    logger.info( "Test logging " + str( i ) )

我担心的是后续日志消息丢失了。我想要实现的是按优先顺序升序:

  1. 退出的例外。
  2. 我能抓住并处理的例外。
  3. 记录器显示错误,但后续消息将转到旧的日志文件。
  4. 记录器显示此错误,但会打开一个新的日志文件并继续正常运行。
  5. 我已经浏览了相关钩子的文档/食谱,但没有任何东西突然出现在我面前。指针同样受欢迎。

    感谢您的帮助,

    乔纳森

1 个答案:

答案 0 :(得分:1)

doRollover中引发的异常将传递给处理程序的handleError方法。您可以定义一个子类并覆盖此方法,以执行您想要处理错误的任何操作。