我正在尝试对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')
Run Code Online (Sandbox Code Playgroud)
但是,当 MAX_LOG_SIZE = 2000 时,log.log 文件的结果包含太多大于 2000 字节的数据
如何限制日志文件的最大大小?
您需要更仔细地阅读文档:您缺少 kwargsmaxBytes和backupCount.
替换这个
handler = RotatingFileHandler(file_name, 'a+', MAX_LOG_SIZE)
Run Code Online (Sandbox Code Playgroud)
为了这
handler = RotatingFileHandler(file_name, 'a+', maxBytes=MAX_LOG_SIZE, backupCount=5)
Run Code Online (Sandbox Code Playgroud)
请注意,您应该设置一个backupCount适合您需要的值,我只是使用了一个随机值。
关于为什么您的代码段不滚动文件的进一步解释是因为该值为backupCount0。请参阅以下内容:
您可以使用 maxBytes 和 backupCount 值来允许文件以预定大小翻转。当即将超过大小时,将关闭文件并静默打开一个新文件进行输出。每当当前日志文件的长度接近 maxBytes 时,就会发生翻转;但是如果 maxBytes 或 backupCount 中的任何一个为零,则不会发生翻转,因此您通常希望将 backupCount 设置为至少 1,并且有一个非零的 maxBytes。