flask使用TimedRotatingFileHandler实现日志轮转
- 2025-04-16 18:38:08
- 开发
- 39
- shevechco
flask中我们想把日志按天来分割出来,实现这个效果可以使用很多方法,但是logging模块中有一个TimedRotatingFileHandler方法可以直接来轮转日志,我们很多年前实际也有一个笔记记录了怎么分割轮转日志,可以查看这个笔记:https://sulao.cn/post/657,实际这个方法在近期使用多进程方式的时候有些问题。所以查找了一些资料,使用logging的TimedRotatingFileHandler类更为简单高效,我们还是使用的应用工厂的方法注册的日志对象,具体代码如下:
#日志配置
def configure_logger(app):
if not os.path.exists(app.config["LOG_PATH"]):
os.makedirs(app.config["LOG_PATH"], mode=0o777)
if app.config["LOG_LEVEL"] == "info":
log_level = logging.INFO
elif app.config["LOG_LEVEL"] == "error":
log_level = logging.ERROR
elif app.config["LOG_LEVEL"] == "debug":
log_level = logging.DEBUG
else:
log_level = logging.CRITICAL
log_file_path = app.config["LOG_PATH"] + os.sep + "blog.log"
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
handler = TimedRotatingFileHandler(log_file_path, when="midnight", interval=1, backupCount=15,encoding="UTF-8")
handler.setLevel(log_level)
handler.setFormatter(formatter)
app.logger.addHandler(handler)
然后在工厂函数中注册上述日志配置
#工厂函数
def create_app():
......
configure_logger(app)
......
然后我们可以在有上下文的地方导入current_app,使用current_app.logger对象下的info,error等方法。
TimedRotatingFileHandler的参数解释如下:
filename: 日志文件的名称。
when: 轮换的时间间隔。常用的值包括:
'S' - 秒(例如,'S6' 表示每6秒)
'M' - 分钟
'H' - 小时
'D' - 天(默认)
'W0'-'W6' - 每周的星期几(0是星期一)
'midnight' - 每天午夜
interval: 如果 when 是时间单位(如 'S', 'M', 'H'),这个参数可以指定间隔数量;如果 when 是具体时间点(如 'W0', 'midnight'),这个参数通常设为1。
backupCount: 保留的备份文件数量。超过这个数量的旧文件将被删除。
在使用 when='midnight' 时,interval=1 表示每天轮换一次。如果你想要每小时或每分钟轮换,你应该使用其他的时间单位(如 'H' 或 'M')和相应的间隔数,效果如下:
日志会自动分割成blog.log.{date}格式。
内容版权声明:除非注明,否则皆为本站原创文章。