RotatingFileHandler 类位于 logging.handlers 模块,它支持磁盘日志文件的轮换。
class logging.handlers.RotatingFileHandler(filename, mode=‘a’, maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None)
返回一个 RotatingFileHandler 类的新实例。 将打开指定的文件并将其用作日志记录流。 如果未指定 mode,则会使用 ‘a’。 如果 encoding 不为 None,则会将其用作打开文件的编码格式。 如果 delay 为真值,则文件打开会被推迟至第一次调用 emit()。 默认情况下,文件会无限增长。 如果提供了 errors,它会被用于确定编码格式错误的处理方式。
执行 rollover 规则:
你可以使用 maxBytes 和 backupCount 值来允许文件以预定的大小执行 rollover。
当即将超出预定大小时,将关闭旧文件并打开一个新文件用于输出。 只要当前日志文件长度接近 maxBytes 就会发生轮换;
当 backupCount 为非零值时,系统将通过为原文件名添加扩展名 ‘.1’, ‘.2’ 等来保存旧日志文件。 例如,当 backupCount 为 5 而基本文件名为 app.log 时,你将得到 app.log, app.log.1, app.log.2 直至 app.log.5。 当前被写入的文件总是 app.log。 当此文件写满时,它会被关闭并重户名为 app.log.1,而如果文件 app.log.1, app.log.2 等存在,则它们会被分别重命名为 app.log.2, app.log.3 等等。子模块(函数)通过logger定义和主模块使用同一个日志模块
容易疏忽的点:
如果 maxBytes 或 backupCount 两者之一的值为零,就不会发生轮换,因此你通常要设置 backupCount 至少为 1,而 maxBytes 不能为零。
同时:如果maxBytes 不为0,backupCount为0时,maxBytes也无法生效,单个文件的大小
也会无限增长。
源码如下:
example:
# myFun.py
# encoding:utf8
import logging
from logging.handlers import RotatingFileHandler
#
# logging模块
# 设置单个日志文件最大3M (3145728字节,*8=位数),最多同时存在200个,总计600M,超过则循环式覆盖
# 当前正在写入的日志名称为Log,其它已达到最大容量的日志名称为 Log.1 .2 .3。。。
#
def myfun():
# 共享主模块日志配置 [通过设置getLogger中的logger 名称与主模块共用同一个logger]
logger = logging.getLogger('weilinlin')
print('========fun========')
for i in range(50):
logger.debug("测试日志fun %d", i)
if __name__ == "__main__":
print('main')
myfun()
# encoding:utf8
import logging
from logging.handlers import RotatingFileHandler
import myFun
logger = logging.getLogger("weilinlin") # 不加名称 设置为root logger
# 设置logger等级
logger.setLevel(logging.DEBUG)
# 设置日志格式
formatter = logging.Formatter(
'%(asctime)s - %(pathname)s - %(name)s - %(levelname)s: - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
# 设置日志回滚 # 单个日志文件最大为1k,最多保存3份日志文件(除了当前写入的文件外),日志文件编码格式为utf-8
handler = RotatingFileHandler("Log", maxBytes=10240, backupCount=3, encoding='utf-8')
handler.setFormatter(formatter)
# 设置日志名称(此处的x是默认日志名称Log.1,Log.2等内容,会自动取到文件名,然后重命名为自定义的名称)
handler.namer = lambda x: "测试日志名称." + x.split('.')[-1]
# 给logger添加handler
logger.addHandler(handler)
# 测试主模块
for i in range(50):
logger.debug("测试日志main %d", i)
# 测试子模块打印日志
myFun.myfun()