日志文件如果写在一个文件中,是很麻烦的事,不便于错误的排查。而且随着项目运行的时间越来越长,日志文件也会也来越大,影响系统性能。
所以日志切割是一件很有必要的事情,logging库已经给我们提供这个方法TimedRotatingFileHandler,对日志可以按照周(W)、天(D)、时(H)、分(M)、秒(S)进行切割,详细介绍[在这里](https://docs.python.org/3.5/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler)。
import logging
from logging.handlers import TimedRotatingFileHandler
LOG_FORMAT = "%(asctime)s=====%(levelname)s=====%(message)s"
log_path = 'logs/run_log.log'
# 每分钟生成一个日志文件 只保存4个日志文件
logger = TimedRotatingFileHandler(log_path, when="M", interval=1, backupCount=4, encoding='utf-8')
logger.suffix = "%Y-%m-%d_%H-%M.log"
# 一定要与suffix对应,否则过期文件不会删除
logger.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}.log$")
logger.setFormatter(logging.Formatter(LOG_FORMAT))
# debug 以上的内容输出到文件里面
# logger.setLevel('DEBUG')
logger.setLevel(logging.DEBUG)
log = logging.getLogger()
log.setLevel('DEBUG')
log.addHandler(logger)
# 将日志内容也输出到运行界面
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
console.setFormatter(logging.Formatter(LOG_FORMAT))
log.addHandler(console)
#### 每日天输出一个日志文件 (未测试)
# 在午夜生成日志文件
logger = TimedRotatingFileHandler(log_path, when="midnight", interval=1, backupCount=7, encoding='utf-8')
logger.suffix = "%Y-%m-%d.log"
# 一定要与suffix对应,否则过期文件不会删除
logger.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log$")
logger.setFormatter(logging.Formatter(LOG_FORMAT))
# debug 以上的内容输出到文件里面
logger.setLevel(logging.DEBUG)
log = logging.getLogger()
log.setLevel('DEBUG')
log.addHandler(logger)
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
console.setFormatter(logging.Formatter(LOG_FORMAT))
log.addHandler(console)suffix是指日志文件名的后缀,suffix中通常带有格式化的时间字符串,filename和suffix由“.”连接构成文件名(例如:filename=“runtime”, suffix=“%Y-%m-%d.log”,生成的文件名为runtime.2015-07-06.log)。
extMatch是一个编译好的正则表达式,用于匹配日志文件名的后缀,它必须和suffix是匹配的,如果suffix和extMatch匹配不上的话,过期的日志是不会被删除的。比如,suffix=“%Y-%m-%d.log”, extMatch的只应该是re.compile(r”^\d{4}-\d{2}-\d{2}.log$”)。
默认情况下,在TimedRotatingFileHandler对象初始化时,suffxi和extMatch会根据when的值进行初始化:
‘S’: suffix=”%Y-%m-%d_%H-%M-%S”, extMatch=r”\^d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}”;
‘M’:suffix=”%Y-%m-%d_%H-%M”,extMatch=r”^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}”;
‘H’:suffix=”%Y-%m-%d_%H”,extMatch=r”^\d{4}-\d{2}-\d{2}_\d{2}”;
‘D’:suffxi=”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”;
‘MIDNIGHT’:”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”;
‘W’:”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”;
如果对日志文件名没有特殊要求的话,可以不用设置suffix和extMatch,如果需要,一定要让它们匹配上