Python RotatingFileHandler的maxBytes参数为何失效?如何限制日志大小?
问题分析与解决方案
你遇到的问题核心是RotatingFileHandler的参数传递顺序错误,导致maxBytes参数没有被正确设置,所以日志文件不会按预期限制大小。
为什么会出现这个问题?
看一下RotatingFileHandler的构造函数签名:
RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None)
你写的代码里:
handler = RotatingFileHandler(file_name, 'a+', MAX_LOG_SIZE)
这里第三个参数MAX_LOG_SIZE被错误赋值给了backupCount(第三个位置参数),而maxBytes使用了默认值0——这个值表示不限制日志文件大小,所以你的日志会一直写入同一个文件,不会触发轮转。
另外,'a+'模式其实没必要,RotatingFileHandler默认的'a'(追加模式)就足够满足需求。
修正后的代码
我们可以调整参数顺序,更稳妥的方式是使用关键字参数(彻底避免顺序搞错),同时建议设置backupCount来保留历史备份文件:
from logging import getLogger, Formatter from logging.handlers import RotatingFileHandler MAX_LOG_SIZE = 2000 # 单个日志文件最大字节数 BACKUP_COUNT = 5 # 最多保留5个备份日志文件 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( filename=file_name, mode='a', maxBytes=MAX_LOG_SIZE, backupCount=BACKUP_COUNT ) 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')
额外说明
backupCount设置为5意味着当log.log达到2000字节时,会被重命名为log.log.1,然后新建一个空的log.log继续写入;当新的log.log又达到大小限制时,log.log.1会变成log.log.2,以此类推,最多保留5个备份文件。- 如果不需要备份文件,可以把
backupCount设为0,但此时达到大小限制后会直接覆盖原文件(不推荐,容易丢失历史日志)。 - 你的
Logger类中检查if not self.__logger.handlers:的逻辑是正确的,避免了重复添加Handler导致日志重复输出的问题。
内容的提问来源于stack exchange,提问作者Begin AC
相关产品推荐
相关产品推荐

