CentOS服务器Gunicorn重启后无法输出Werkzeug/Flask日志至文件
Flask+Gunicorn在CentOS下日志无法输出到指定文件的问题解决
问题描述
本地终端可正常查看Werkzeug/Flask默认日志,但在CentOS服务器上重启Gunicorn服务后,日志无法输出到指定文件,仅能在虚拟环境的Shell中查看日志。
期望的日志格式示例
[2023-10-21 18:01:38,550] INFO in _internal: * Restarting with stat [2023-10-21 18:01:39,049] WARNING in _internal: * Debugger is active! [2023-10-21 18:01:39,052] INFO in _internal: * Debugger PIN: 691-655-964 [2023-10-21 18:58:06,111] INFO in _internal: [31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:5000 * Running on http://10.200.16.168:5000 [2023-10-21 18:58:06,111] INFO in _internal: [33mPress CTRL+C to quit[0m [2023-10-21 18:58:06,111] INFO in _internal: * Restarting with stat [2023-10-21 18:58:06,691] WARNING in _internal: * Debugger is active! [2023-10-21 18:58:06,707] INFO in _internal: * Debugger PIN: 691-655-964 [2023-10-21 19:01:45,844] INFO in _internal: 127.0.0.1 - - [21/Oct/2023 19:01:45] "GET / HTTP/1.1" 200 - [2023-10-21 19:01:45,917] INFO in _internal: 127.0.0.1 - - [21/Oct/2023 19:01:45] "[36mGET /static/media/Ericsson_logo.png HTTP/1.1[0m" 304 - [2023-10-21 19:01:46,068] INFO in _internal: 127.0.0.1 - - [21/Oct/2023 19:01:46] "[36mGET /static/jqueryAdd.js HTTP/1.1[0m" 304 -
当前日志配置代码
import os import logging import logging.handlers from flask import Flask, redirect, url_for, render_template, request, session, flash from datetime import timedelta from logging.config import dictConfig dictConfig({ 'version': 1, 'handlers': { 'file.handler': { 'class': 'logging.handlers.RotatingFileHandler', 'filename': 'server_werkzeug.log', 'maxBytes': 10000000, 'backupCount': 5, 'level': 'DEBUG', }, }, 'loggers': { 'werkzeug': { 'level': 'INFO', 'handlers': ['file.handler'], }, }, }) #logging.basicConfig(filename='flask_record.log', level=logging.INFO, format=f'%(asctime)s %(levelname)s %(name)s %(threadName)s : %(message)s') app = Flask(__name__)
解决方案
1. 使用绝对路径指定日志文件
相对路径会受Gunicorn启动时的工作目录影响,导致日志文件写入位置不符合预期。修改配置中的日志路径为绝对路径:
'filename': '/var/log/flask/server_werkzeug.log'
同时确保该路径对应的目录存在,且Gunicorn运行用户拥有读写权限。
2. 检查并配置Gunicorn日志参数
Gunicorn默认会捕获应用的标准输出/错误,可能干扰Flask的日志配置。启动Gunicorn时可指定日志文件,或关闭日志捕获:
- 启动示例(指定Gunicorn自身日志):
gunicorn --workers=2 --bind=0.0.0.0:5000 --access-logfile /var/log/gunicorn/access.log --error-logfile /var/log/gunicorn/error.log app:app - 若要完全使用Flask的日志配置,可添加
--disable-logging参数关闭Gunicorn日志干预。
3. 确保日志目录权限正确
创建日志目录并设置所属用户/组:
sudo mkdir -p /var/log/flask /var/log/gunicorn sudo chown your_gunicorn_user:your_gunicorn_group /var/log/flask /var/log/gunicorn
替换your_gunicorn_user和your_gunicorn_group为实际运行Gunicorn的用户和组(比如nginx或你创建的应用用户)。
4. 验证日志配置有效性
在Flask代码中添加测试日志,排查配置是否生效:
# 在app = Flask(__name__)后添加 logging.info("测试日志输出:检查是否写入指定文件")
重启Gunicorn后查看日志文件是否有这条记录,判断是配置问题还是路径/权限问题。
内容的提问来源于stack exchange,提问作者Treyon KC
相关产品推荐
相关产品推荐

