qua*_*oid 7 python logging uwsgi
我正在使用这些选项(以及其他选项)围绕 Python Flask webapp 运行 uwsgi,以在标准输出上获取 JSON 编码的日志记录:
fmt=$'{"timestamp": "${strftime:%FT%TZ}", "level": "DEBUG", "name": "uwsgi", "message": "${msg}"}\n'
uwsgi --env="TZ=UTC" --log-encoder="json ${fmt}" --logformat="%(status) [%(msecs)ms] %(method) %(uri)"
Run Code Online (Sandbox Code Playgroud)
这很好地编码了来自 uwsgi 的标准输出,但不幸的是也编码了来自我的应用程序的日志记录,它已经是 JSON 格式,所以我得到如下内容:
{"timestamp": "2017-10-02T22:48:11Z", "level": "DEBUG", "name": "uwsgi", "message": "spawned uWSGI http 1 (pid: 75298)"}
{"timestamp": "2017-10-02T22:48:15Z", "level": "DEBUG", "name": "uwsgi", "message": "{\"timestamp\": \"2017-10-02T22:48:15.200Z\", \"message\": \"Descriptor requested\", \"request\": \"c6b08680-a7c3-11e7-9495-186590cba8eb\", \"name\": \"myapp.main\", \"level\": \"INFO\"}"}
{"timestamp": "2017-10-02T22:48:15Z", "level": "DEBUG", "name": "uwsgi", "message": "200 [11ms] GET /descriptor.json"}
Run Code Online (Sandbox Code Playgroud)
中间记录与 uwsgi 的其他输出使用相同的 JSON 编码。
如何避免 Flask 应用程序的输出被编码,但保持 uwsgi 本身的其他输出的编码?
我尝试了--log-encoder和 的各种组合,--log-req-encoder但后者似乎没有编码。文档对这两个选项之间的区别不是很清楚。
最后,我必须删除--log-encoderstdout(和 stderr)并通过一个将输出包装在 JSON 中的进程,除非已经编码为 JSON。
function log_json() { python -u -c "
import sys
import json
import datetime
log = dict(name='uwsgi', level='$1')
line = sys.stdin.readline()
while line:
line = line.strip()
if line.startswith('{') and line.endswith('}'):
print(line)
elif line:
log['timestamp'] = datetime.datetime.utcnow().isoformat() + 'Z'
log['message'] = line
print(json.dumps(log))
line = sys.stdin.readline()
"; }
{ uwsgi ... 2>&1 1>&3 3>&- | log_json ERROR; } 3>&1 1>&2 | log_json INFO
Run Code Online (Sandbox Code Playgroud)
如果您只想对请求日志记录进行编码,请添加--logger-req=stdio选项以--log-req-encoder正确编码请求日志记录。
| 归档时间: |
|
| 查看次数: |
2350 次 |
| 最近记录: |