java tail_Java用WebSocket + tail命令实现Web实时日志
原文:http://blog.csdn.net/xiao__gui/article/details/50041673在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail -f或者tailf命令。查看实时日志可能会需要首先SSH连上Linux主机,步骤很麻烦不说,如果是生产环境的服务器,可能还会控制各种权限。基于Web的实时日志可以解决这个问题。由于传统的HTTP协议是请求
原文:http://blog.csdn.net/xiao__gui/article/details/50041673
在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail -f或者tailf命令。查看实时日志可能会需要首先SSH连上Linux主机,步骤很麻烦不说,如果是生产环境的服务器,可能还会控制各种权限。基于Web的实时日志可以解决这个问题。
由于传统的HTTP协议是请求/响应模式,而实时日志需要不定时的持续的输出,由服务器主动推送给客户端浏览器。所以这里使用的是HTML5的WebSocket协议。
按照惯例,先上图:

Java后台
JSR 356是Java实现WebSocket的一套规范,所以需要一个支持JSR 356的服务器,例如Tomcat、Jetty的最新版本。
JSR 356提供了注解@ServerEndpoint,并需要指定一个路径,用于处理客户端WebSocket请求。
importjava.io.IOException;importjava.io.InputStream;importjavax.websocket.OnClose;importjavax.websocket.OnError;importjavax.websocket.OnOpen;importjavax.websocket.Session;importjavax.websocket.server.ServerEndpoint;
@ServerEndpoint("/log")public classLogWebSocketHandle {privateProcess process;privateInputStream inputStream;/*** 新的WebSocket请求开启*/@OnOpenpublic voidonOpen(Session session) {try{//执行tail -f命令
process = Runtime.getRuntime().exec("tail -f /var/log/syslog");
inputStream=process.getInputStream();//一定要启动新的线程,防止InputStream阻塞处理WebSocket的线程
TailLogThread thread = newTailLogThread(inputStream, session);
thread.start();
}catch(IOException e) {
e.printStackTrace();
}
}/*** WebSocket请求关闭*/@OnClosepublic voidonClose() {try{if(inputStream != null)
inputStream.close();
}catch(Exception e) {
e.printStackTrace();
}if(process != null)
process.destroy();
}
@OnErrorpublic voidonError(Throwable thr) {
thr.printStackTrace();
}
}
由于针对每个WebSocket连接都会创建一个新的LogWebSocketHandle实例,所以可以不用像Servlet一样考虑线程安全问题。由于tail -f命令的输入流会阻塞当前线程,所以一定要创建一个新的线程来读取tail -f命令的返回结果:
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjavax.websocket.Session;public class TailLogThread extendsThread {privateBufferedReader reader;privateSession session;publicTailLogThread(InputStream in, Session session) {this.reader = new BufferedReader(newInputStreamReader(in));this.session =session;
}
@Overridepublic voidrun() {
String line;try{while((line = reader.readLine()) != null) {//将实时日志通过WebSocket发送给客户端,给每一行添加一个HTML换行
session.getBasicRemote().sendText(line + "
");
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
Web前端
Web前端需要通过WebSocket连接到服务端,实时接收最新的日志内容并展示到页面上。
tail log更多推荐




所有评论(0)