删除日志文件后python日志记录丢失消息
我正在使用删除日志文件后python日志记录丢失消息,python,logging,Python,Logging,我正在使用RotatingFileHandler和timedrotingfilehandler。在我手动删除日志文件之前,一切正常。 例如,我的日志文件被写入/path/to/mylog.log。如果该文件被删除或gzip,python将无法找到它,并且所有后续日志消息都将丢失,尽管所有代码似乎都运行良好 是否有任何方法可以同时匹配以下请求: 如果应用程序启动时文件不存在,请创建日志文件。(我知道日志记录模块已经为我完成了这项工作) 如果在应用程序启动后删除了日志文件,请重新创建日志文件并继续
RotatingFileHandler
和timedrotingfilehandler
。在我手动删除日志文件之前,一切正常。例如,我的日志文件被写入
/path/to/mylog.log
。如果该文件被删除或gzip,python将无法找到它,并且所有后续日志消息都将丢失,尽管所有代码似乎都运行良好
是否有任何方法可以同时匹配以下请求:
- 如果应用程序启动时文件不存在,请创建日志文件。(我知道
模块已经为我完成了这项工作)日志记录
- 如果在应用程序启动后删除了日志文件,请重新创建日志文件并继续记录,而不重新启动应用程序
- 日志旋转仍然可以像
和RotatingFileHandler
那样正常工作timedrotingfilehandler
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)
您必须编写自己的记录器类来实现这一点。FileHandler假设一旦应用程序启动,脚本之外的任何内容都不会触及该文件 对于在应用程序运行时可以删除/移动文件的情况,有一个特殊的处理程序。它是
WatchedFileHandler
,是FileHandler
的一个版本,如果文件不存在,它将重新打开/重新创建文件。但是,对于旋转处理程序,没有此版本
因此,您必须将
WatchedFileHandler
和RotatingFileHandler
结合起来才能获得两者的功能。您必须手动删除日志文件吗?事实上,它是由我们的Devops团队压缩的,因为文件可能太大,尽管它一点也不大。他们对服务器上的所有应用程序都这样做@牦牛叶