这个问题在这里已有答案:
我的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访问它时它只能返回部分日志文件。
那我该怎么办?
在github上查看pygtail。
Pygtail读取尚未读取的日志文件行。它甚至可以处理已旋转的日志文件。
从他们的例子:
from pygtail import Pygtail
for line in Pygtail("some.log"):
sys.stdout.write(line)