欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

python websocket网页实时显示远程服务器日志信息

程序员文章站 2022-04-30 17:54:24
功能:用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息 一般我们在运维工具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显示程序日志给开发人员看。你还在用ajax每隔段时间去获取服务器日志?out了,试试用websocket方式吧 我用bottle框架, ......

功能:用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 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的获取日志脚本

 

获取到的结果

python websocket网页实时显示远程服务器日志信息

 

   

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/