我正在使用这些选项(以及其他选项)围绕 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 …
考虑这个 Celery 工作流程:
wf = collect_items.s() | add_details.s() | publish_items.s()
Run Code Online (Sandbox Code Playgroud)
它收集一些项目,并行地为每个项目添加额外的细节,然后在某处发布装饰信息。
我想要的是add_details作为一组任务,每个项目一个,并行获取每个项目的详细信息。显然,该组必须从 输出的数据中生成collect_items。
这是我尝试过的,使用默认的 rabbitmq 代理:
app = Celery(backend="rpc://")
@app.task
def collect_items(n):
return range(n)
@app.task
def add_details(items):
return group(get_details.s(i) for i in items).delay()
@app.task
def get_details(item):
return (item, item * item)
@app.task
def publish_items(items):
print("items = %r" % items)
Run Code Online (Sandbox Code Playgroud)
我希望输出是数字 0-9,用它们的平方装饰,所有这些都是同时计算的:
>>> wf.delay(10).get()
items = [(0, 0), (1, 1), (2, 4), ... (8, 64), (9, 81)]
Run Code Online (Sandbox Code Playgroud)
这确实调用了预期的任务,但不幸的是,即使任务似乎已完成,也将结果publish_items作为一堆GroupResults包含AsyncResultsPENDING 状态传递给。
我等不及这些结果了,publish_items …