【问题标题】:Custom method for python log file rotations?python日志文件轮换的自定义方法?
【发布时间】:2017-10-04 20:33:06
【问题描述】:

我无法让日志文件轮换在 Python (v2.6.6) 中工作。我需要对使用 TimedRotatingFileHandler 找到的日志文件扩展名进行命名控制,以及在使用 RotatingFileHandler 找到的大小阈值处强制日志文件轮换的能力。

如果我建立一个 TimedRotatingFileHandler 类型的日志处理程序 fh,我可以在旋转日志文件的扩展名中包含一个 DT 标记。我是这样做的:

 fh = logging.handlers.TimedRotatingFileHandler('/mydirpath/logs/logFileBaseName', when='H', interval=1, backupCount=48)
 fh.suffix = '%Y%m%d_%H%M%S'
 fh.extMatch = re.compile(r"^\d{8}\_\d{6}$")

但是,显然如果我的 python 脚本在间隔发生时没有主动写入日志,则日志将不会轮换。单个日志文件增长并增长到极端大小。

作为替代方案,我尝试了一个简单的 RotatingFileHandler。它似乎让我能够指定日志轮换,因为它允许我指定大小阈值。一旦达到该阈值或什至接近该阈值,日志就会旋转。在我的情况下,这就是为这种处理程序类型建立 fh 的方式:

 fh = logging.handlers.RotatingFileHandler('/mydirpath/logs/logFileBaseName', maxBytes=7000000, backupCount=48)

使用 RotatingFileHandler 日志确实按预期旋转,但似乎我无法将我的 DT 标记添加到旋转的日志文件扩展名中。如文档中所述,我得到了 .1、.2、.3 等的扩展名。我必须在旋转日志文件的扩展名中包含这些 DT。

我怀疑我需要使用 RotatingFileHandler 但使用覆盖方法来自定义旋转日志文件的扩展名。我还不精通python,也不知道如何确定日志包中要覆盖的正确方法。我也不知道如何在我的 python 类中建立这样的覆盖方法来覆盖包类中的方法。

我希望能得到一些帮助。如果我误解或误用了 python 旋转文件处理程序,我想修正我的错误。如果我认为需要方法覆盖是正确的,我希望从社区中做过类似事情的人那里得到一个例子。提前感谢您的帮助。

【问题讨论】:

标签: python logging


【解决方案1】:

你真的不想这样。文件名约定不是偶然的,但可以确保您的日志系统行为正确:

  • 当您及时轮换时,您会提前知道应该在什么时间创建日志文件,因此在名称中使用时间戳是有意义的
  • 当您在大小阈值上轮换时,您无法提前知道应该在什么时间创建日志文件。如果你用它们的创建时间戳来命名它们,你将无法知道日志文件是否丢失,因此它们的名称中会包含连续的数字

话虽如此,所有常见的文件系统都将文件的创建和修改时间作为文件属性,因此您可以构建一个 python 脚本,使用新名称中的创建时间复制/移动文件。这样一来,您就不必弄乱 Python 日志记录系统,只需要一个使用 os.stat 的易于编写和测试的脚本。

【讨论】:

  • 我不明白。在任何一种情况下,基本文件名都没有创建日期时间戳。 DT 在创建时嵌入在旋转的日志文件中 - 为什么在任何一种情况下它是 basename.1 或 basename.20171004_101007 都重要? TimedRotatingFileHandler 能够跟踪我的轮换日志文件序列并使其过期,因为可以告诉它查找以 basename 开头并以 ^\d{8}_\d{6}$ 结尾的所有文件。这些扩展仅在基本日志轮换时添加。旋转是时间驱动还是大小驱动有什么关系?
  • 我想归结为:为什么这个 fh = logging.handlers.TimedRotatingFileHandler('/mydirpath/logs/logFileBaseName', when='H', interval=1, backupCount= 48) 每小时轮换一次日志输出?
猜你喜欢
  • 2021-10-15
  • 2020-07-17
  • 2013-06-06
  • 2022-06-15
  • 2010-09-07
  • 2015-01-16
  • 1970-01-01
  • 2015-12-19
  • 2012-09-12
相关资源
最近更新 更多