【发布时间】:2013-05-04 14:51:09
【问题描述】:
我遵循了一个 SO 接受的关于如何从 here 的 /var/log/gateway 读取 Django 中的日志文件的答案,并且我设法在终端上输出文件,就像这里一样。
2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...
2013-05-09T12:57:44.160246+08:00 localhost gateway[5205]: System start complete.
2013-05-09T15:13:47.428553+08:00 localhost gateway[4777]: * Unable to connect to device /home/smartsensor1. Device may be offline. *
下一步是,我想输出日志文件并以 html 显示,我是这样对原始代码稍作修改的。
def Logs(request):
with open('../../../../../var/log/gateway') as f:
while True:
line = f.readline()
if line:
print line
return HttpResponse(line)
所以在客户端,我根据另一个 SO 接受的答案 here 将 Ajax 放在这样的位置。
$.ajax({
type: "GET",
url : "{% url WebServiceApp.logging.Logs %}",
success: function (data) {
$("#output").append(data);
setTimeout("doUpdate()", 2000);
}
});
}
setTimeout("doUpdate()", 2000);
这样,来自 Ajax 的输出数据继续显示在日志文件的第一行。在这种情况下,是这样的
2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...
2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...
2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...
我知道会发生这种情况,因为每次 ajax 访问服务器时,服务器都会执行它需要做的事情并将输出发送回日志文件的第一行并通过 HttpResponse 输出并完成循环,但它从未得到有机会做另一条线,因为它已经完成了。当另一个查询完成时,它会一次又一次地做同样的事情。
所以可能的解决方案是客户端询问服务器一次,服务器保持逐行输出日志文件并将其发送给客户端。我不确定这是否可能,所以在这里我问任何专家如何可能实现我可以逐行输出日志文件的结果/
【问题讨论】:
-
保持连接打开并在生成时发送附加数据称为长轮询 - 但我不确定您将如何在 django 中实现这一点。顺便说一句,考虑使用绝对而不是相对 URL - 当您的应用安装在子目录中时会发生什么?
-
你可以使用 websockets 建立持久连接
-
哦,好的。让我阅读有关日志轮询的信息,也许它会给我提示如何在这里解决我的问题。嗯,感谢您对 url 的评论,但是当我使用绝对 url 而不是相对 url 时会不会导致同样的问题?我的意思是它仍然找不到它?
-
@dm03514 谢谢。我忘了在我的问题中提到应用任何并行服务器目前不是一个选项。所以我不得不使用ajax或者暂时看一下Basic提到的这个long polling。
-
re: urls
/var/log/blah总是指向同一个地方。../../../var/log/blah将改变它指向的位置,这取决于从哪里请求路径。例如,从/srv/www/test指向/var/log/blah,但从/srv/www/test/something指向/srv/var/log/blah