功能:用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息
一般我们在运维工具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显示程序日志给开发人员看。你还在用ajax每隔段时间去获取服务器日志?out了,试试用websocket方式吧
我用bottle框架,写了个websocket服务端,浏览器连接到websocket server,再用python subprocess获取远程服务器的日志信息,subprocess,就是用Popen调用shell的shell命令而已,这样可以获取到实时的日志了,然后再send到websocket server中,那连接到websocket server的浏览器,就会实时展现出来了
用二台服务器来实现这个场景,A服务器是websocket服务端,B服务器是日志端
A服务器是我浏览器本机,websocket服务端也是这台机,IP是:192.168.2.222
B服务器是要远程查看日志的服务器,我这里用:192.168.2.224
以下是在A服务器的操作(Python2)
安装:
pip install bottle
pip install websocket-client
pip install bottle-websocket
websocket servet的python代码:
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 from bottle importget, run4 from bottle.ext.websocket importGeventWebSocketServer5 from bottle.ext.websocket importwebsocket6 users = set() #连接进来的websocket客户端集合
7 @get('/websocket/', apply=[websocket])8 defchat(ws):9 users.add(ws)10 whileTrue:11 msg = ws.receive() #接客户端的消息
12 ifmsg:13 for u inusers:14 u.send(msg) #发送信息给所有的客户端
15 else:16 break
17 #如果有客户端断开连接,则踢出users集合
18 users.remove(ws)19 run(host='0.0.0.0', port=8000, server=GeventWebSocketServer)
记得安装bottle、websocket-client 、bottle-websocket 模块,服务端允许所有的IP访问其8000端口
websocket服务端除了用以上的方法外,还可以用这下面的方法实现:
http://www.linuxyw.com/831.html
在电脑桌面,写一个简单的HTML5 javascripts页面,随便命名了,如test.html,这个页面使用了websocket连接到websocket服务端:
1
2
3
4
5
6 #msg{
7 width:400px; height:400px; overflow:auto; border:2px solid #000000;background-color:#000000;color:#ffffff;
8 }9
10
11
12
实时日志
13
14
15
16 $(document).ready(function() {17 /* !window.WebSocket、window.MozWebSocket检测浏览器对websocket的支持*/
18 if(!window.WebSocket) {19 if(window.MozWebSocket) {20 window.WebSocket =window.MozWebSocket;21 } else{22 $('#msg').prepend("
你的浏览器不支持websocket
");23 }24 }25 /* ws = new WebSocket 创建WebSocket的实例 注意设置对以下的websocket的地址哦*/26 ws = new WebSocket('ws://192.168.2.222:8000/websocket/');27 /*
28 ws.onopen 握手完成并创建TCP/IP通道,当浏览器和WebSocketServer连接成功后,会触发onopen消息29 ws.onmessage 接收到WebSocketServer发送过来的数据时,就会触发onmessage消息,参数evt中包含server传输过来的数据;30 */
31 ws.onopen =function(evt) {32 $('#msg').append('
websocket连接成功');33 }34 ws.onmessage =function(evt) {35 $('#msg').prepend('' + evt.data + '');36 }37 });3839
40