树莓派视频流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




