功能:用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息javascript
通常咱们在运维工具部署环境的时候,须要实时展示部署过程当中的信息,或者在浏览器中实时显示程序日志给开发人员看。你还在用ajax每隔段时间去获取服务器日志?out了,试试用websocket方式吧html
我用bottle框架,写了个websocket服务端,浏览器链接到websocket server,再用python subprocess获取远程服务器的日志信息,subprocess,就是用Popen调用shell的shell命令而已,这样能够获取到实时的日志了,而后再send到websocket server中,那链接到websocket server的浏览器,就会实时展示出来了html5
用二台服务器来实现这个场景,A服务器是websocket服务端,B服务器是日志端java
A服务器是我浏览器本机,websocket服务端也是这台机,IP是:192.168.2.222python
B服务器是要远程查看日志的服务器,我这里用:192.168.2.224jquery
如下是在A服务器的操做(Python2)linux
安装:nginx
pip install bottleweb
pip install websocket-clientajax
pip install bottle-websocket
websocket servet的python代码:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 from bottle import get, run 4 from bottle.ext.websocket import GeventWebSocketServer 5 from bottle.ext.websocket import websocket 6 users = set() # 链接进来的websocket客户端集合 7 @get('/websocket/', apply=[websocket]) 8 def chat(ws): 9 users.add(ws) 10 while True: 11 msg = ws.receive() # 接客户端的消息 12 if msg: 13 for u in users: 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 <!DOCTYPE html> 2 <html> 3 <head> 4 </head> 5 <style> 6 #msg{ 7 width:400px; height:400px; overflow:auto; border:2px solid #000000;background-color:#000000;color:#ffffff; 8 } 9 </style> 10 </head> 11 <body> 12 <p>实时日志</p> 13 <div id="msg"></div> 14 <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> 15 <script> 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("<p>你的浏览器不支持websocket</p>"); 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('<li>websocket链接成功</li>'); 33 } 34 ws.onmessage = function(evt) { 35 $('#msg').prepend('<li>' + evt.data + '</li>'); 36 } 37 }); 38 </script> 39 </body> 40 </html>
到这里,就搞定浏览器链接到websocket服务端的场景了,如今要A服务器里‘远程查看日志.py’,去采集B服务器的实时信息了,其实采集原理很简单,就是使用shell中的tailf命令,实时显示最新的信息而已,咱们在这段脚本中,使用subprocess.Popen()来远程查看日志信息:
python代码以下:
1 #!/usr/bin/python 2 # encoding=utf-8 3 import subprocess 4 import time 5 from websocket import create_connection 6 # 配置远程服务器的IP,账号,密码,端口等,因我作了双机密钥信任,因此不须要密码 7 r_user = "root" 8 r_passwd='jason_zhang' 9 r_ip = "192.168.2.224" 10 r_port = 22 11 r_log = "/tmp/test.log" # 远程服务器要被采集的日志路径 12 # websocket服务端地址 13 ws_server = "ws://192.168.2.222:8000/websocket/" 14 # 执行的shell命令(使用ssh远程执行) 15 cmd = "/usr/bin/ssh -p {port} {user}@{ip} /usr/bin/tailf {log_path}".format(user=r_user,ip=r_ip,port=r_port,log_path=r_log) 16 def tailfLog(): 17 """获取远程服务器实时日志,并发送到websocket服务端""" 18 popen = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True) 19 print('链接成功') 20 ws = create_connection(ws_server) # 建立websocket链接 21 while True: 22 line = popen.stdout.readline().strip() #获取内容 23 if line: 24 ws.send(line) #把内容发送到websocket服务端 25 print (time.time()) 26 if __name__ == '__main__': 27 tailfLog()
在服务器B的日志文件随便输入点东西,再运行服务器A的获取日志脚本
获取到的结果
tailfLog()文章最后再解析subprocess.Popen的原理和功能
执行websocket服务端脚本和上面这个websocket客户端采集脚本,再打开用浏览器打开上面的html5页面后,环境就基本部署好了,双websocket客户端链接到websocket服务端中
上面脚本指定的r_log = "/tmp/web_socket.log"日志路径,咱们须要生成这个日志文件,并不停地往里面写入日志,这样才能在浏览器中实时显示效果(真实场景中,能够指定服务器某日志,如apache,nginx日志等)
刚才提到subprocess.Popen的原理和功能,请看如下资料:
http://www.cnblogs.com/fengbeihong/articles/3374132.html
bottle websocket参考资料:
http://rfyiamcool.blog.51cto.com/1030776/1269232/