使用Flask和gunicorn进行JSON格式化日志记录

时间:2016-01-12 20:30:30

标签: python json logging flask gunicorn

我正在尝试做与此处所解释的非常类似的事情:https://sebest.github.io/post/protips-using-gunicorn-inside-a-docker-image/

我想让我的Flask app + gunicorn输出JSON格式的日志记录。我已经为Flask应用程序工作了,但我似乎无法使用gunicorn。

这是我目前的输出:

<h1>Box Sizing</h1>

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger pin code: 317-187-130 192.168.99.1 - - [12/Jan/2016 20:09:29] "GET /nothing HTTP/1.1" 404 - {"asctime": "2016-01-12 20:20:25,541", "levelname": "WARNING", "module": "app", "funcName": "err", "lineno": 17, "message": "will assert false..."} 192.168.99.1 - - [12/Jan/2016 20:20:25] "GET /err HTTP/1.1" 500 - 开头的行是代码{"asctime":的输出,它正确地记录为JSON。好极了。以app.logger.warning('will assert false...')开头的行是从我的gunicorn WSGI服务器输出的,令人沮丧的是,它们不是JSON格式的。

这是我用来启动gunicorn的命令:

192.168.99.1

gunicorn --log-config gunicorn_logging.conf -c gunicorn_config.py api.app:app 文件包含:

gunicorn_logging.conf

,文件[loggers] keys=root, gunicorn.error [handlers] keys=console [formatters] keys=json [logger_root] level=INFO handlers=console [logger_gunicorn.error] level=ERROR handlers=console propagate=0 qualname=gunicorn.error [handler_console] class=StreamHandler formatter=json args=(sys.stdout, ) [formatter_json] class=jsonlogging.JSONFormatter 包含:

gunicorn_config.py

以下是import os import multiprocessing addr = os.environ.get('HTTP_ADDR', '0.0.0.0') port = os.environ.get('HTTP_PORT', '5000') loglevel = os.environ.get('LOG_LEVEL', 'info') bind = '{0}:{1}'.format(addr, port) workers = multiprocessing.cpu_count() * 5 + 1 worker_class = 'gevent' timeout = 0 的输出:

pip freeze

1 个答案:

答案 0 :(得分:8)

获取访问日志以及配置文件应该如下所示:

[loggers]
keys=root, gunicorn.error, gunicorn.access
...
[logger_gunicorn.access]
level=(DEBUG|INFO|ERROR)
handlers=console
propagate=0
qualname=gunicorn.access

访问记录在INFO日志级别,因此如果要显示它们,请确保将“logger_gunicorn.access”标记中的日志级别设置为至少INFO