我已经按照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输出并完成循环并且它从未得到过有机会再行,因为它已经完成了。当另一个查询完成后,它会再次执行相同的操作。
所以可能的解决方案是客户端询问服务器一次,服务器逐行输出日志文件并将其发送给客户端。我不确定这是否可能,所以在这里我要求任何专家如何可能实现结果,我可以逐行输出日志文件/
答案 0 :(得分:0)
好吧,你可以使用这样的想法:
使用GET
参数,您可以像这样控制视图的方法:
def Logs(request):
whole_file = True
if request.GET.get('whole_file') == 0:
whole_file = False
return_string = ''
with open('../../../../../var/log/gateway') as f:
while True:
line = f.readline()
if line:
return_string += line + '<br>' # <br> is for breakline html, do it your way
if not whole_file: break # break if you only need first line
return HttpResponse(line)
这样,你在get参数中包含一个变量,它告诉你的视图是返回整个日志文件(第一次)还是仅返回第一行(下一次)。
然后在您的ajax中,您必须包含一种向网址插入GET
参数的方法。您使用{{url}}
标签,我不太确定如何使用它,但我相信您会在文档中找到一些内容,如果您不能尝试其他方法,如静态字符串(不是很漂亮)或为它创建自己的自定义标签。
这将是您可能的javascript的示例:
$.ajax({
type: "GET",
url : "/ajax_log/?whole_file=0", //this will request the whole file
success: function (data) {
$("#output").append(data);
setTimeout("doUpdate()", 2000);
}
});
}
setTimeout("doNextUpdate()", 2000);
function doNextUpdate(){
$.ajax({
type: "GET",
url : "/ajax_log/?whole_file=1", //this will request the just the first line success: function (data) {
$("#output").append(data);
setTimeout("doUpdate()", 2000);
}
});
}
}
这是我的想法,以实现你想要的。我希望它有所帮助。
答案 1 :(得分:0)
我找到了解决此问题的方法是执行服务器发送事件
在服务器端,我使用依赖于django-sse
的sseimport os
from django.conf import settings
from django.views.generic import View
from django_sse.views import BaseSseView
import time
from django.utils.timezone import now
from datetime import datetime
from django.utils.timezone import now
from dateutil import parser
class MySseEvents(BaseSseView):
def iterator(self):
while True:
if not os.path.exists('/var/log/gateway'):
file('/var/log/gateway', 'w+').close()
with open('/var/log/gateway') as f:
while True:
#get the current time
currenttime = now()
#read a line from gateway
line = f.readline()
if line:
#split the line read into 4 section
str = line.split(' ',3)
#compare if the time from the log file is less than the current time
logtime = parser.parse(str[0])
if logtime >= currenttime:
#print when the log is written after the current time
output = '%s: %s' % (datetime.strftime(logtime,'%d/%m %H:%M %p'), str[3])
self.sse.add_message("line", output)
time.sleep(1)
yield
我上面做的if logtime >= currenttime:
检查是为了确保html只在页面加载后打印出日志而不是整个日志文件。
然后在HTML5方面,我做了类似于我提供的第一个链接上显示的作者的例子。
<div id="tab9" class="tab_content">
<table>
<tr>
<td>
<p> Shows the records of the logs on gateway.</p>
<div style="border:1px solid; height: 200px; width: 850px; overflow: auto;" id="output"></div>
</td>
</tr>
</table>
</div>
<script>
$(document).ready(function() {
var source = new EventSource('/gtwy/logging/');
var events_dom = $("#output");
source.addEventListener("line", function(e) {
events_dom.append(e.data + "<br>");
});
});
</script>
使用此功能,我设法显示日志,因为它可用。我面临的唯一问题是创建需要权限的网关文件本身,因为我正在尝试在/var/log
中创建它。