Flask:如何逐行提供更新日志文件?

时间:2018-01-02 03:02:02

标签: python python-3.x web flask

我的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访问它时,它只能返回部分日志文件。

那我该怎么办?

1 个答案:

答案 0 :(得分:1)

在github上查看pygtail。

  

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

从他们的例子:

from pygtail import Pygtail

for line in Pygtail("some.log"):
    sys.stdout.write(line)