导读:本期聚焦于小伙伴创作的《Python Flask日志怎么配_基于标准logging模块按照大小或按天自动滚动请求日志记录》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Python Flask日志怎么配_基于标准logging模块按照大小或按天自动滚动请求日志记录》有用,将其分享出去将是对创作者最好的鼓励。

在使用Python Flask开发Web应用的过程中,记录请求日志是排查接口问题、统计服务运行状态的重要手段。Flask本身内置了日志功能,但默认的日志配置只会将日志输出到控制台,且没有自动滚动机制,长期运行后日志会不断堆积,既不方便查看也会占用大量磁盘空间。通过Python标准库中的logging模块,我们可以灵活配置日志的存储方式、滚动规则,实现按文件大小或者按日期自动切割日志文件的需求。

Python Flask日志怎么配_基于标准logging模块按照大小或按天自动滚动请求日志记录

基础环境准备

首先需要确保已经安装了Flask框架,如果没有安装可以通过以下命令完成安装:

pip install flask

本文示例基于Flask 2.0以上版本,logging模块是Python标准库自带,不需要额外安装。

按日志文件大小自动滚动配置

按大小滚动日志需要使用logging模块中的RotatingFileHandler处理器,该处理器可以在日志文件达到指定大小后自动创建新的日志文件,同时可以设置保留的历史日志文件数量。

完整配置代码示例

以下是一个Flask应用按大小滚动请求日志的完整实现:

from flask import Flask, request
import logging
from logging.handlers import RotatingFileHandler
import os

# 创建Flask应用实例
app = Flask(__name__)

# 配置日志相关参数
log_dir = "logs"  # 日志存储目录
log_file = "flask_request.log"  # 日志文件名
max_file_size = 10 * 1024 * 1024  # 单个日志文件最大大小,这里设置为10MB
backup_count = 10  # 最多保留10个历史日志文件

# 创建日志目录,如果目录不存在则自动创建
if not os.path.exists(log_dir):
    os.makedirs(log_dir)

# 创建RotatingFileHandler实例
rotating_handler = RotatingFileHandler(
    filename=os.path.join(log_dir, log_file),
    maxBytes=max_file_size,
    backupCount=backup_count,
    encoding="utf-8"
)

# 设置日志格式
log_formatter = logging.Formatter(
    "%(asctime)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)
rotating_handler.setFormatter(log_formatter)

# 获取Flask应用的logger对象,添加处理器
app.logger.addHandler(rotating_handler)
# 设置日志级别为INFO,只记录INFO及以上级别的日志
app.logger.setLevel(logging.INFO)

# 定义请求日志记录的装饰器,用于记录每个请求的详细信息
def log_request_info(f):
    from functools import wraps
    @wraps(f)
    def decorated_function(*args, **kwargs):
        # 记录请求方法、路径、客户端IP
        log_msg = f"Request: {request.method} {request.path} | Client IP: {request.remote_addr}"
        app.logger.info(log_msg)
        return f(*args, **kwargs)
    return decorated_function

# 给所有路由添加请求日志记录装饰器
app.before_request(log_request_info)

# 测试路由
@app.route("/")
def index():
    return "Hello Flask Logging"

@app.route("/test")
def test():
    return "Test Route"

if __name__ == "__main__":
    app.run(debug=False, host="127.0.0.1", port=5000)

配置参数说明

上述代码中几个关键参数的作用如下:

  • maxBytes:单个日志文件的最大大小,单位是字节,示例中设置为10MB,当日志文件达到这个大小后会自动切割。
  • backupCount:保留的历史日志文件数量,超过这个数量的旧日志文件会被自动删除。
  • encoding:日志文件的编码格式,设置为utf-8可以避免中文乱码问题。

运行上述代码后,所有请求日志都会写入logs/flask_request.log文件,当该文件大小达到10MB时,会自动重命名为flask_request.log.1,新的日志会继续写入flask_request.log,最多保留10个历史文件。

按日期自动滚动日志配置

如果需要按天、按小时等时间维度自动切割日志,可以使用TimedRotatingFileHandler处理器,该处理器支持按照指定的时间间隔自动创建新的日志文件。

完整配置代码示例

以下是按天滚动日志的实现示例:

from flask import Flask, request
import logging
from logging.handlers import TimedRotatingFileHandler
import os

# 创建Flask应用实例
app = Flask(__name__)

# 配置日志相关参数
log_dir = "logs"  # 日志存储目录
log_file = "flask_request_daily.log"  # 日志文件名
when = "midnight"  # 滚动时间,midnight表示每天凌晨滚动
interval = 1  # 间隔时间,配合when使用,1表示每1个midnight滚动一次
backup_count = 30  # 保留30天的历史日志

# 创建日志目录
if not os.path.exists(log_dir):
    os.makedirs(log_dir)

# 创建TimedRotatingFileHandler实例
time_rotating_handler = TimedRotatingFileHandler(
    filename=os.path.join(log_dir, log_file),
    when=when,
    interval=interval,
    backupCount=backup_count,
    encoding="utf-8"
)

# 设置日志格式
log_formatter = logging.Formatter(
    "%(asctime)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)
time_rotating_handler.setFormatter(log_formatter)

# 添加处理器到Flask logger
app.logger.addHandler(time_rotating_handler)
app.logger.setLevel(logging.INFO)

# 请求日志装饰器
def log_request_info(f):
    from functools import wraps
    @wraps(f)
    def decorated_function(*args, **kwargs):
        log_msg = f"Request: {request.method} {request.path} | Client IP: {request.remote_addr}"
        app.logger.info(log_msg)
        return f(*args, **kwargs)
    return decorated_function

app.before_request(log_request_info)

# 测试路由
@app.route("/")
def index():
    return "Hello Flask Daily Logging"

if __name__ == "__main__":
    app.run(debug=False, host="127.0.0.1", port=5000)

when参数可选值说明

when参数支持多种时间单位,常见的取值如下:

参数值含义
S每秒滚动一次
M每分钟滚动一次
H每小时滚动一次
D每天滚动一次
midnight每天凌晨滚动一次
W0-W6每周指定星期几滚动,W0表示周一,W6表示周日

注意事项

  • 生产环境中建议关闭Flask的debug模式,避免debug模式的日志输出影响正常日志记录。
  • 如果同时配置了按大小滚动和按时间滚动的处理器,两个处理器会同时生效,日志会同时写入两个对应的日志文件中。
  • 日志格式可以根据实际需求调整,比如添加请求参数、响应状态码等信息,方便后续问题排查。
  • 如果需要记录更详细的请求信息,可以结合request对象获取请求头、请求体等内容,注意不要记录敏感信息比如用户密码等。
logging模块是线程安全的,在Flask多进程或者多线程部署的场景下可以正常使用,不需要额外做线程同步处理。

通过上述两种配置方式,就可以实现Flask请求日志的自动滚动需求,开发者可以根据实际业务场景选择合适的滚动策略,既可以按大小切割避免单个文件过大,也可以按时间维度切割方便按日期查找日志。

PythonFlasklogging日志滚动修改时间:2026-06-19 17:57:41

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。