flask & gunicorn 日志部署

发布于:2025-03-22 ⋅ 阅读:(161) ⋅ 点赞:(0)

在使用 Gunicorn 运行 Flask 应用时,可以通过配置 Gunicorn 的日志功能来保存访问信息。Gunicorn 默认会将日志输出到标准输出(stdout)和标准错误(stderr),但你可以通过配置文件或命令行参数将日志保存到文件中,并自定义日志格式。

以下是实现方法:


1. Gunicorn 日志配置

Gunicorn 提供了多种日志配置选项,可以通过命令行参数或配置文件来设置。

(1) 命令行参数

在启动 Gunicorn 时,可以通过以下参数配置日志:

  • --access-logfile:指定访问日志文件路径。
  • --error-logfile:指定错误日志文件路径。
  • --log-level:设置日志级别(如 infodebugwarning 等)。
  • --access-logformat:自定义访问日志格式。

示例:

gunicorn --access-logfile access.log --error-logfile error.log --log-level info app:app
(2) 配置文件

可以将 Gunicorn 的配置写入一个 Python 文件(如 gunicorn_config.py),然后通过 -c 参数加载配置文件。

配置文件示例:

# gunicorn_config.py

# 日志文件路径
accesslog = "access.log"
errorlog = "error.log"

# 日志级别
loglevel = "info"

# 访问日志格式
access_logformat = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'

启动命令:

gunicorn -c gunicorn_config.py app:app

2. 自定义访问日志格式

Gunicorn 的 access_logformat 支持以下占位符:

  • %(h)s:客户端 IP 地址。
  • %(l)s:远程用户标识(通常为 -)。
  • %(u)s:认证用户(通常为 -)。
  • %(t)s:请求时间。
  • %(r)s:请求行(如 GET / HTTP/1.1)。
  • %(s)s:响应状态码。
  • %(b)s:响应体大小(字节)。
  • %(f)s:Referer 头。
  • %(a)s:User-Agent 头。

示例:

access_logformat = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'

3. 结合 Flask 的日志

如果你希望在 Flask 应用中也记录日志,可以使用 Python 的 logging 模块。

(1) 配置 Flask 日志

在 Flask 应用中配置日志:

import logging
from flask import Flask

app = Flask(__name__)

# 配置日志
handler = logging.FileHandler('flask.log')
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
app.logger.addHandler(handler)
app.logger.setLevel(logging.INFO)

@app.route('/')
def index():
    app.logger.info('访问首页')
    return "Hello, World!"
(2) 结合 Gunicorn 日志

Gunicorn 的日志和 Flask 的日志可以同时使用。Gunicorn 负责记录访问日志和错误日志,Flask 负责记录应用内部的日志。


4. 完整示例

假设你的 Flask 应用文件为 app.py,Gunicorn 配置文件为 gunicorn_config.py,以下是完整的配置和启动步骤。

(1) Flask 应用 (app.py)
import logging
from flask import Flask

app = Flask(__name__)

# 配置日志
handler = logging.FileHandler('flask.log')
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
app.logger.addHandler(handler)
app.logger.setLevel(logging.INFO)

@app.route('/')
def index():
    app.logger.info('访问首页')
    return "Hello, World!"
(2) Gunicorn 配置文件 (gunicorn_config.py)
# 日志文件路径
accesslog = "access.log"
errorlog = "error.log"

# 日志级别
loglevel = "info"

# 访问日志格式
access_logformat = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
(3) 启动 Gunicorn
gunicorn -c gunicorn_config.py app:app

5. 日志文件

  • 访问日志access.log
  • 错误日志error.log
  • Flask 日志flask.log

6. 总结

  • 通过 Gunicorn 的 --access-logfile--error-logfile 参数,可以将访问日志和错误日志保存到文件中。
  • 使用 access_logformat 可以自定义访问日志格式。
  • 结合 Flask 的 logging 模块,可以记录应用内部的日志。
  • 通过配置文件和命令行参数,可以灵活地管理日志输出。