您将如何实现一个包含文本区域的 jsp 站点,该文本区域显示(tomcat)服务器上的日志文件并自动刷新。
我认为刷新很容易使用 setTimeout 轮询服务器并发送 ajax 请求。但问题是如何监视服务器上的文件(它是一个 Log4J 日志文件——也许我可以使用自己的附加程序?)以进行更改并在 ajax 请求到达时仅发送更改的行?
我不知道如何检测日志中更改的行...
ajax并每隔几秒轮询一次服务器是个好主意,但是使用comet / server-push / websocket会更有效,而且您不会遇到任何延迟。
关于服务器端,您有几个选择:
每次用户请求新数据时打开文件,转到末尾并发送最后几行。您需要以某种方式指出上次发送的行数据,以避免多次发送相同的行或丢失其中一些行。使用 AJAX 调用的时间戳参数来表示:在...之后给我所有日志行
这个方案非常无效,会产生大量的I/O流量
为每个客户端保持打开的流到日志文件,当客户端要求换行时,尽可能多地阅读(当然不要阻塞)。
好多了,但不能很好地扩展(打开的文件太多,我来了)
编写自定义log4j appender 并将最近的日志保存在内存中。当客户询问时,只需转储此缓冲区的内容(适用于时间戳的相同限制)
非常健壮,但要注意内存使用!
最后考虑使用现成的工具,如 psi-probe提供开箱即用的此功能:
psi-probe http://psi-probe.googlecode.com/svn/wiki/Features/log-tail.png
没有尾巴/ajax,但有这个
有一个标签库:http ://www.servletsuite.com/servlets/tailtag.htm
将jar放在WEB-INF/lib中,tld放在WEB-INF/tags中,就可以使用了:
<%@ taglib uri="taglib.tld" prefix="t" %>
<!-- read last 50 rows and print them -->
<t:tail file="c:/webserver/log.txt" count="50" id="S">
<br><%=S%>
</t:tail>
线程中提到了我不知道的非常好的解决方案,这是我在google-stail中找到的另一个解决方案
Jakarta Common IO library 提供的 Tailer 可能会有所帮助。Tailer 可以充当生产者,GUI 轮询可以充当消费者。