我正在使用 RotatingFileHandler
和 TimedRotatingFileHandler
。一切正常,直到我手动删除日志文件。
例如,我的日志文件被写入 /path/to/mylog.log
。如果此文件被删除或 gzipped,python 将无法找到它,并且所有后来的日志消息都会丢失,尽管所有代码似乎都运行良好。
有什么办法可以同时匹配关注请求:
logging
模块已经为我做了这件事)RotatingFileHandler
和 TimedRotatingFileHandler
一样正常工作。谢谢@blues 的回答。我尝试了他的建议并在此处获得了一些代码,未经过全面测试,但似乎有效。
import logging
from logging.handlers import RotatingFileHandler, WatchedFileHandler, TimedRotatingFileHandler
class WatchedRotatingFileHandler(RotatingFileHandler, WatchedFileHandler):
def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False):
RotatingFileHandler.__init__(self, filename=filename, mode='a', maxBytes=maxBytes, backupCount=backupCount, encoding=encoding, delay=delay)
self.dev, self.ino = -1, -1
self._statstream()
def emit(self, record):
try:
if self.shouldRollover(record):
self.doRollover()
self.reopenIfNeeded()
logging.FileHandler.emit(self, record)
except Exception:
self.handleError(record)
class WatchedTimedRotatingFileHandler(TimedRotatingFileHandler, WatchedFileHandler):
def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None):
TimedRotatingFileHandler.__init__(
self,
filename,
when=when,
interval=interval,
backupCount=backupCount,
encoding=encoding,
delay=delay,
utc=utc,
atTime=atTime
)
self.dev, self.ino = -1, -1
self._statstream()
def emit(self, record):
try:
if self.shouldRollover(record):
self.doRollover()
self.reopenIfNeeded()
logging.FileHandler.emit(self, record)
except Exception:
self.handleError(record)
答案 0 :(得分:0)
您必须编写自己的 Logger 类来执行此操作。 FileHandlers 假设一旦应用程序启动,该文件就不会被脚本之外的任何内容触及。
对于在应用程序运行时可以删除/移动文件的情况,有一个特殊的处理程序。它是 WatchedFileHandler
并且它是 FileHandler
的一个版本,如果文件消失,它将重新打开/重新创建文件。然而,对于旋转处理程序没有这个版本。
因此您必须结合使用 WatchedFileHandler
和 RotatingFileHandler
才能获得两者的功能。