在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail -f
或者tailf
命令。查看实时日志可能会需要首先SSH连上Linux主机,步骤很麻烦不说,如果是生产环境的服务器,可能还会控制各种权限。基于Web的实时日志可以解决这个问题。
由于传统的HTTP协议是请求/响应模式,而实时日志需要不定时的持续的输出,由服务器主动推送给客户端浏览器。所以这里使用的是HTML5的WebSocket协议。
按照惯例,先上图:
Java后台
JSR 356是Java实现WebSocket的一套规范,所以需要一个支持JSR 356的服务器,例如Tomcat、Jetty的最新版本。
JSR 356提供了注解@ServerEndpoint
,并需要指定一个路径,用于处理客户端WebSocket请求。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
由于针对每个WebSocket连接都会创建一个新的LogWebSocketHandle实例,所以可以不用像Servlet一样考虑线程安全问题。由于tail -f
命令的输入流会阻塞当前线程,所以一定要创建一个新的线程来读取tail -f
命令的返回结果:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
Web前端
Web前端需要通过WebSocket连接到服务端,实时接收最新的日志内容并展示到页面上。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
完成编码后,就可以部署了。由于用到tail
命令,该项目需要部署在Linux系统上。
最后,需要代码的同学可以在评论中留下邮箱。
Demo on GitHub:https://github.com/wucao/websocket-tail-demo