python日志文件轮换的自定义方法?

时间:2017-10-04 11:50:02

标签: python logging

我无法在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旋转文件处理程序,我想修复我的错误。如果我是正确的,需要方法覆盖,我希望从社区中做过类似事情的人那里得到一个例子。提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:0)

你真的不想那样。文件名约定不是偶然的,但允许确保您的日志记录系统正常运行:

  • 当你及时轮换时,你事先知道应该在什么时候创建日志文件,所以在名称中使用时间戳是有意义的
  • 当您按大小阈值旋转时,您无法预先知道应在何时创建日志文件。如果使用创建时间戳命名它们,则无法知道日志文件是否已丢失,因此它们的名称中会连续出现数字

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