Flask:如何逐行提供更新日志文件? [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我的Python程序中有两个线程,一个用于flask,另一个用于后台任务,它会在运行时动态生成一些日志字符串到日志文件中。

我试过用yield像这样流式传输文件:

@app.route('/task_status')
def get_background_task_log():
    def read_task_log():

        # Try load log files
        log_file = open("/tmp/task_log.log", "r")

        # Stream file to the client
        while True:
            new_line = log_file.readline()

            # Stream the file to the client until it ends.
            if "Foo: process finished!" in new_line:
                yield new_line.encode("utf-8")  # Flush the last line
                break

            yield new_line.encode("utf-8")

    return Response(read_task_log(), mimetype="text/plain",
                    headers={"Content-Disposition": "inline; filename=task_log.log"})

但是当Chrome加载/task_status时,它只是挂在那里等到行Foo: process finished出来,而不是逐行显示内容。我也尝试删除Content-Disposition标题,它保持不变。

同时我也尝试过使用send_file()但是当我从Chrome访问它时它只能返回部分日志文件。

那我该怎么办?

python python-3.x web flask
1个回答
1
投票

在github上查看pygtail。

Pygtail读取尚未读取的日志文件行。它甚至可以处理已旋转的日志文件。

从他们的例子:

from pygtail import Pygtail

for line in Pygtail("some.log"):
    sys.stdout.write(line)
© www.soinside.com 2019 - 2024. All rights reserved.