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