实时抓取网页数据(用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息)
优采云 发布时间: 2021-09-26 14:15实时抓取网页数据(用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息)
功能:使用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息
一般我们在部署运维工具的环境时,需要实时展示部署过程中的信息,或者在浏览器中展示程序日志,让开发者实时查看。你还在使用ajax定期获取服务器日志吗?出来,尝试使用 websocket 方法
我使用bottle框架写了一个websocket服务器,浏览器连接websocket服务器,然后使用python子进程获取远程服务器的日志信息。子进程就是用Popen调用shell的shell命令,这样就可以得到实时的日志。,然后发送到websocket服务器,连接到websocket服务器的浏览器会实时显示
用两台服务器来实现这个场景,服务器A是websocket服务器,服务器B是日志
A服务器是我浏览器的本地机器,websocket服务器也是这台机器。IP为:192.168.1.221
服务器B是远程查看日志的服务器,我这里用的是:192.168.1.10
以下是A服务器的websocket servert的python代码:
#!/usr/bin/envpython#coding=utf-8#__author__='戴儒锋'#"""Pipinstallbottlepipinstallwebsocket-clientpipinstallbottle-websocket"""frombottleimportget,runfrombottle.ext.websocketimportGeventWebSocketServerfrombottle.ext.websocketusers=importwebsocketsetusers=importwebsocketset 必须安装执行代码前()#连接websocket客户端集合@get('/websocket/',apply=[websocket])defchat(ws):users.add(ws)whileTrue:msg=ws.receive()#接收客户端的message ifmsg:foruinusers:u.send(msg)#向所有客户端发送信息 else:break#如果客户端断开连接,踢出用户设置 users.remove(ws)run(host='0.@ >0. @>0.@>0',port=8000,server=GeventWebSocketServer)
记得安装bottle、websocket-client 和bottle-websocket 模块。服务器允许所有IP访问其8000端口
除了以上方法,websocket服务端还可以通过以下方法实现:
使用gevent-websocket实现websocket服务端程序
在电脑桌面上,写一个简单的HTML5 javascripts页面,随便起个名字,比如web_socket.html。此页面使用 websocket 连接到 websocket 服务器:
实时日志
“味精”>
注意:WebSocket('ws://192.168.1.221:8000/websocket/'); 这里192.168.1.221一定要改成你的websocket服务器IP,切记!!!
至此,浏览器连接到了websocket服务器。现在我们需要在A服务器写一段代码,去采集B服务器的实时信息。其实采集的原理很简单。就是使用shell。在tailf命令中,实时显示最新信息。在这个脚本中,我们使用 subprocess.Popen() 来远程查看日志信息:
python代码如下:
#!/usr/bin/python#encoding=utf-8importsubprocessimporttimefromwebsocketimportcreate_connection#配置远程服务器的IP、账号、密码、端口等。因为我做了双机密钥信任,不需要密码 r_user="root"r_ip="192.168.1.10"r_port=22r_log="/tmp/ web_socket.log" #远程服务器的日志路径为采集#websocket服务器地址 ws_server ="ws://192.168.1.221:8000 /websocket/"#Shell 命令执行(使用ssh远程执行) 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)deftailfLog():"""获取远程服务器实时日志,并发送给websocket服务器"""popen=subprocess。
文章最后分析subprocess.Popen的原理和作用
执行websocket服务端脚本和上面的websocket客户端采集脚本,然后用浏览器打开上面的html5页面,环境基本部署完毕,双websocket客户端连接websocket服务端
上面脚本指定的r_log="/tmp/web_socket.log"日志路径,我们需要生成这个日志文件并不断的往里面写入日志,这样效果才能在浏览器中实时显示(在真实场景中) ,可以指定服务器的A日志,如apache、nginx日志等)
我们在B服务器上写一段python代码,然后每隔一秒在r_log="/tmp/web_socket.log"日志中写入内容:
python代码如下:
#!/usr/bin/envpython#coding=utf-8importtimeimportrandomlog_path='/tmp/web_socket.log'while1:withopen(log_path,'a')asf:f.write('[%s]%s\n'% (time.ctime(),random.random()))time.sleep(1)
脚本写的内容大概是:
[2016 年 7 月 26 日星期二 18:30:41] 0.@>527242649654
[2016 年 7 月 26 日星期二 18:30:42] 0.@>21080845298
[2016 年 7 月 26 日星期二 18:30:43] 0.@>23128691356
[2016 年 7 月 26 日星期二 18:30:44] 0.@>689547600796
执行这个脚本,然后查看浏览器效果:
这是我临时写的。如果要在真正的运维工具中使用,需要根据具体情况修改很多内容,但原理是这样的。可以根据自己的情况修改完善使用。
刚才提到了subprocess.Popen的原理和作用,请看以下资料:
瓶装websocket参考资料: