【发布时间】:2021-08-14 13:13:41
【问题描述】:
我正在使用RotatingFileHandler 和TimedRotatingFileHandler。在我手动删除日志文件之前一切正常。
例如,我的日志文件被写入/path/to/mylog.log。如果此文件被删除或压缩,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()
# notice reopenIfNeeded() calls os.stat
# may cause
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()
# notice that reopenIfNeeded calls os.stat
# it may cause efficiency issues
self.reopenIfNeeded()
logging.FileHandler.emit(self, record)
except Exception:
self.handleError(record)
【问题讨论】:
-
必须手动删除日志文件吗?
-
事实上,它是由我们的 Devops 团队 gzip 压缩的,因为文件可能太大了,尽管它一点也不大。他们为服务器上的所有应用程序执行此操作。 @leaf_yakitori