Python日志记录:如果在程序运行时删除它,则创建新的日志文件(RotatingFileHandler)

时间:2017-04-24 15:23:45

标签: python python-3.x logging

我有一个运行的python程序,它使用TimedRotatingFileHandler不断记录到文件。我不时想要获取日志文件而不关闭程序,所以我只是剪切&将日志文件粘贴到其他位置。 如果我这样做,程序不会崩溃,但也不会记录到任何文件。 在查看BaseRotatingFileHandler的源代码之后: def emit(自我,记录):     尝试:         如果self.shouldRollover(记录):             self.doRollover()         logging.FileHandler.emit(self,record)     除例外:         self.handleError(记录) 我想我可以继承TimedRotatingFileHandler并重新实现它的emit函数,如下所示: def emit(自我,记录):     尝试:         如果不是os.path.exists(self.baseFilename)或self.shouldRollover(record):             self.doRollover()         logging.FileHandler.emit(self,record)     除例外:         self.handleError(记录) 以下片段似乎实现了我想要的。但我不确定我的方法是否是解决问题的最佳方法。有没有更好的方法来实现这一点,或者我做得对吗? 
 
 import logging.handlers
 导入日志记录
 进口时间
 import os
 
 
 class TimedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler):
     def __init __(self,filename,** kwargs):
         super().__ init __(filename,** kwargs)
 
     def emit(自我,记录):
         尝试:
             如果不是os.path.exists(self.baseFilename)或self.shouldRollover(record):
                 self.doRollover()
             logging.FileHandler.emit(self,record)
         除了例外:
             self.handleError(记录)
 
 
 logging.basicConfig(handlers = [TimedRotatingFileHandler(' test.log')])
 
 对于范围(10)中的x:
     time.sleep(1)
     logging.critical('测试')
 
 
 编辑: 我应用了@danny提供的解决方案。为了保持RotatingFileHandler功能,我创建了一个TimedRotatingFileHandler和WatchedFileHandler的混合类: class WatchedTimedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler,logging.handlers.WatchedFileHandler):     def __init __(self,filename,** kwargs):         super().__ init __(filename,** kwargs)         self.dev,self.ino = -1,-1         self._statstream()     def emit(自我,记录):         self.reopenIfNeeded()         超()发出(记录)

2 个答案:

答案 0 :(得分:2)

由于在Windows平台上无法更改打开的文件,因此可以说OP并不是在寻找跨平台的解决方案。

在这种情况下,logging.handlers.WatchedFileHandler是在记录的文件发生更改时继续记录的适当解决方案。

来自docs:

  

WatchedFileHandler类,位于logging.handlers模块中,   是一个FileHandler,它监视它正在登录的文件。如果是文件   更改,关闭并使用文件名重新打开。

没有可用的旋转监视文件处理程序,因此必须使用此解决方案将旋转移动到logrotate或类似。

或者使用您的TimedRotatingHandler补丁,除了您已经使用的代码之外,还需要正确关闭并重新打开文件句柄,以匹配WatchedFileHandler的内容。

答案 1 :(得分:0)

处理它的最跨平台的方法是只采取旧的"文件,保留最新文件。 这甚至可以在不改变处理程序实现的情况下工作,并且不会在不同平台下失败。