在使用 Gunicorn 运行 Flask 应用时,可以通过配置 Gunicorn 的日志功能来保存访问信息。Gunicorn 默认会将日志输出到标准输出(stdout)和标准错误(stderr),但你可以通过配置文件或命令行参数将日志保存到文件中,并自定义日志格式。
以下是实现方法:
1. Gunicorn 日志配置
Gunicorn 提供了多种日志配置选项,可以通过命令行参数或配置文件来设置。
(1) 命令行参数
在启动 Gunicorn 时,可以通过以下参数配置日志:
--access-logfile
:指定访问日志文件路径。--error-logfile
:指定错误日志文件路径。--log-level
:设置日志级别(如info
、debug
、warning
等)。--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
模块,可以记录应用内部的日志。 - 通过配置文件和命令行参数,可以灵活地管理日志输出。