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')和相应的间隔数,效果如下:202504161846375811850372.png

日志会自动分割成blog.log.{date}格式。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.sulao.cn/post/1027

相关推荐