为什么Python RotatingFileHandler的“maxBytes”不起作用

时间:2018-01-04 12:42:15

标签: python logging

我正在尝试对logging模块的RotatingFileHandler进行如下测试:

from logging import getLogger, Formatter
from logging.handlers import RotatingFileHandler

MAX_LOG_SIZE = 2000

_null = lambda *s: None
LOG_FORMAT = '%(process)d [%(name)s %(asctime)s] %(levelname)s: %(message)s'

class Logger(object):
    __slots__ = '_Logger__logger'

    def __init__(self, name='main'):
        self.__logger = getLogger(name)
        if not self.__logger.handlers:
            self.add_handler(name)

    def add_handler(self, name):

        file_name = 'log.log'
        handler = RotatingFileHandler(file_name, 'a+', MAX_LOG_SIZE)
        handler.setFormatter(Formatter(LOG_FORMAT))
        self.__logger.addHandler(handler)
        self.__logger._file_name = file_name

    def ERROR(self, msg, *args):
        self.__logger.error(msg, *args, **{})

if __name__ == '__main__':
    logger = Logger()
    for i in range(1000):
        logger.ERROR('logger.content')

但是,使用MAX_LOG_SIZE = 2000时,log.log文件的结果包含的数据太多,大于2000字节

如何限制日志文件的最大大小?

1 个答案:

答案 0 :(得分:2)

您需要更仔细地阅读documentation:您错过了maxBytesbackupCount

替换此

handler = RotatingFileHandler(file_name, 'a+', MAX_LOG_SIZE)

这个

handler = RotatingFileHandler(file_name, 'a+', maxBytes=MAX_LOG_SIZE, backupCount=5)

请注意,您应设置一个符合您需求的backupCount值,我只是随机使用。

进一步解释为什么您的代码段不会滚动文件是因为值backupCount为0.请参阅以下内容:

  

您可以使用maxBytes和backupCount值来允许文件   以预定尺寸翻转。当大小即将来临时   超出,文件关闭,并以静默方式打开一个新文件   输出。只要当前日志文件差不多就会发生翻转   maxBytes的长度; 但如果maxBytes或backupCount为零,   永远不会发生翻转,因此您通常希望将backupCount设置为   至少为1,并且maxBytes为非零。