日期:2014-05-20  浏览次数:20818 次

如何在网页上动态显示Tomcat日志
大家好!有一个问题。
以前做了一个程序,功能就是将数据从一个数据库导入另一个数据库,添加了时间监听器。没到晚上一点执行。
也可以手动在ecplise里运行,由于当时只写了后台程序,没有页面。
  现在经理说写一个页面,除了晚上自动运行之外点击页面的按钮也可以执行(和eclipse运行差不多)。
但是有一个要求,就是要页面上能看到运行的状态。比如在Tomcat中每条数据运行时我通过打印时间和SQL语句就可以
看到到底运行到呢个表里了。

  但是在页面上怎么动态的看运行结果呢?

 我刚才试了一下,将本来打印到控制台的字符串(就是表名啊,SQL语句啊)放在LIST中,然后在页面循环打印LIST中的字符串。
这样不行啊。每当刷新页面时,页面就死在那儿,其实刷新的时候后台程序已经跑了,但是页面没有显示字符串,用户就感觉页面死了,没动,等到所有程序跑完之后,页面一下就全显示了LIST的执行结果,是一瞬间显示的,没有像控制台一样执行一个表显示一条执行的语句(在控制台通过打印这条语句就可以看到执行到哪个表了):


我要在JSP页面怎么弄才能达到控制台的效果啊(就是在页面上执行一条SQL,打印一条,而不是全部执行完之后一瞬间全部显示,因为执行完要一个小时,相当于用户页面一个小时不动,一个小时后刷的一下全显示,这样不行,用户以为死机了呢)。

------解决方案--------------------
这个跟nba显示数据不是一样么,
jsp定时器Ajax技术每隔几秒或几分钟从后台取数据,

个人见解,可能实现的有很多难点。

期待高手指点!
------解决方案--------------------
你们经理说得轻巧、简单!
------解决方案--------------------
他以为网页像 tail -f 那样么?
------解决方案--------------------
不要说网页了,连 Windows 中都没有内置的 tail -f
------解决方案--------------------
以前的代码有线程同步吗?

有一点要提醒的是,你的页面,点击”开始导入数据”时,它你需要让它运行在另一个线程中,然后立即准备转换等待消息队列中取消息的页面,如果你的操作没有新开一个线程去执行的话,那就肯定要等到 1 个小时后执行完的时候才能看到结果,这是主要的问题。

有什么原因阻塞了你的读取消息的操作,要找到这个问题,运行 Tomcat 在 debug 模式,在中间半天取不到页的时候,在 Debug 视图中,找到你认为是当前的线程的那一行,点击 Debug 视图的工具条(Debug 视图的工具条,不是Eclipse 上的全局的工具条) 上的“Pause“,或点右键选择 Pause,这时能看到当前线程执行到哪一行代码。看“导入数据”线程和“取消息”线程是同样的办法去检查。

你的代码在取走消息后把它从消息列表中清除吗?这个放入消息和清除消息需要“生产-消费者”一样的同步控制。


------解决方案--------------------
我觉得与其因为数据变化而通知前台网页,不如你在网页里面写个定时器,通过js写的。然后Ajax不断请求后台,返回当前的调试信息,然后显示在页面中。
------解决方案--------------------
这里有个东西要推荐给你。你可以使用log4j来记录运行的状态。系统的所有类或模板都可以设置不能日志信息。如果要实时在网页上面看,可以利用ajax来实时读取log4j的日志文件。log4j可以配置为html或普通的log方式。这就看你怎么花心思做了。这个功能我在别的网站上看到过。一个网页类似的命令控制台。你可以去google一把。

------解决方案--------------------
樓上提到了log4j,就寫一個 log4j的 appender吧,
http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Appender.html

這個appender身兼servlet的角色,用 map 保持100筆(或更多)的log資料,同時把log寫到html,
命名為yyyy-mm-dd.html,再寫一個頁面會列出過去幾天的 html,點下去就列出當日的log。
萬一一天的log太多,還可以用小時命名,甚至以分命名。

即時部分就用透過AJAX 和 servlet去要資料,不帶參數時回map的全部或10筆(視需求),
之後帶筆數,然後回傳最新的log。