You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

树莓派视频流Flask应用:非Debug模式下如何记录日志?

解决Flask关闭Debug模式时日志不写入文件的问题

当然没问题!这其实是Flask默认日志配置的一个小细节——当你关闭Debug模式时,它不会自动把日志输出到文件,得咱们手动给它加个日志处理器才行。我来给你一步步讲怎么解决:

为什么会出现这个情况?

Flask在debug=True模式下,会自动启用一套更详细的日志配置,包括将日志定向到文件;但切换到生产模式(debug=False)时,默认只把日志输出到控制台,不会主动写入文件。所以咱们需要手动配置日志系统,让它在任何模式下都能把日志存到error.log里。

具体解决方案:手动配置日志处理器

下面是一个完整的示例,既可以记录Flask应用本身的日志,也能捕获Werkzeug(Flask底层的WSGI服务器)的请求日志:

from flask import Flask
import logging
from logging.handlers import RotatingFileHandler

app = Flask(__name__)

# 配置日志系统
if not app.debug:
    # 创建一个按大小分割的日志处理器,避免单个日志文件过大
    # maxBytes设置单文件最大10MB,backupCount保留5个备份文件
    file_handler = RotatingFileHandler(
        'error.log',
        maxBytes=1024*1024*10,
        backupCount=5,
        encoding='utf-8'
    )
    # 设置日志级别为INFO:这样INFO及以上级别(WARNING、ERROR、CRITICAL)的日志都会被记录
    file_handler.setLevel(logging.INFO)
    # 定义日志格式:包含时间、日志来源、级别和内容
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    )
    file_handler.setFormatter(formatter)
    
    # 将处理器添加到Flask应用的日志器
    app.logger.addHandler(file_handler)
    # 同时把Werkzeug的请求日志也定向到同一个文件(可选,如果需要记录请求信息的话)
    from werkzeug import logging as werkzeug_logging
    werkzeug_logger = werkzeug_logging.create_logger(app)
    werkzeug_logger.addHandler(file_handler)

# 测试日志输出
@app.route('/')
def home():
    app.logger.info('用户访问了首页')
    app.logger.error('模拟一个错误日志')
    return '视频流推送服务运行中'

if __name__ == '__main__':
    app.run(debug=False)

关键配置说明

  • RotatingFileHandler:相比普通的FileHandler,它会在日志文件达到指定大小后自动分割,避免日志文件无限膨胀,适合长期运行的服务。
  • 日志级别:如果需要记录更细节的调试信息,可以把file_handler.setLevel(logging.DEBUG);如果只关注错误和警告,设置为logging.WARNING即可。
  • 权限问题:确保运行Flask的用户对当前目录有写入权限,否则会创建不了error.log文件。

简化版配置(适合快速测试)

如果你不需要日志分割,也可以用更简单的basicConfig配置根日志(注意要在Flask应用初始化前调用):

import logging
from flask import Flask

# 先配置根日志
logging.basicConfig(
    filename='error.log',
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    encoding='utf-8'
)

app = Flask(__name__)

@app.route('/')
def home():
    app.logger.info('测试日志')
    return 'Hello'

if __name__ == '__main__':
    app.run(debug=False)

不过这种方式会影响整个Python进程的日志配置,可能会捕获其他第三方库的日志,所以更推荐第一种针对Flask应用的配置方式。

这样配置后,不管Debug模式是否开启,所有指定级别的日志都会被写入error.log文件啦!

内容的提问来源于stack exchange,提问作者Nick D

火山引擎 最新活动