首页 > 解决方案 > 自定义旋转器和命名器函数不适用于 python 中的 RotatingFileHandler 记录器处理程序?

问题描述

我在下面提到了使用旋转器和命名器功能的链接,但它们不起作用(没有任何区别)

链接:https ://docs.python.org/3/howto/logging-cookbook.html#using-a-rotator-and-namer-to-customize-log-rotation-processing

我希望将日志压缩并命名为 system1.log.gz,但它们像 system.log.1 一样保存,因此我进行了以下更改,但仍然无法正常工作。

环境:python 2.7.5

import logging
import os
import zlib
from logging.handlers import RotatingFileHandler
LOG_PATH = "/tmp"
FILE_NAME = "system.log"

Logger = logging.getLogger()

def namer(name):
    orig_name = name.split(".")
    return orig_name[0] + orig_name[2] + ".log.gz"


def rotator(source, dest):
    with open(source, "rb") as sf:
        data = sf.read()
        compressed = zlib.compress(data, 9)
        with open(dest, "wb") as df:
            df.write(compressed)
    os.remove(source)

logFormatter = logging.Formatter(
    "%(asctime)s %(levelname)s [%(threadName)s] %(filename)s:%(lineno)d %(message)s")
Logger.setLevel(logging.DEBUG)

fileHandler = RotatingFileHandler(
"{0}/{1}".format(LOG_PATH, FILE_NAME), maxBytes=1000,    backupCount=10)
fileHandler.setFormatter(logFormatter)
fileHandler.rotator = rotator
fileHandler.namer = name
Logger.addHandler(fileHandler)

预期的压缩日志名称:system1.log.gz

实际非压缩日志名称:system.log.1

标签: pythonloggingzlibfilehandlerlog-rotation

解决方案


您正在使用说明书python 3,但使用python 2.7.5. 您尝试使用的功能在 3 中根本不存在。最好的解决方案是使用 python 3,因为版本 2 将在几个月后退役。如果这不是一个选项,您可以通过创建自己的处理程序类来实现所需的行为,该处理程序类继承RotatingFileHandler并覆盖emitand doRolloveremit需要进行压缩和doRollover命名。


推荐阅读