python websocket網頁實時顯示遠程服務器日志信息


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

 

獲取到的結果

 

   

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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM