运维开发:python websocket网页实时显示远程服务器日志信息

时间:2022-10-26 09:12:08

功能:用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.1.221

B服务器是要远程查看日志的服务器,我这里用:192.168.1.10

以下是A服务器的websocket servet的python代码:

  1. #!/usr/bin/env python
  2. #coding=utf-8
  3. # __author__ = '戴儒锋'
  4. # http://www.linuxyw.com
  5. """
  6. 执行代码前需要安装
  7. pip install bottle
  8. pip install websocket-client
  9. pip install bottle-websocket
  10. """
  11. from bottle import get, run
  12. from bottle.ext.websocket import GeventWebSocketServer
  13. from bottle.ext.websocket import websocket
  14. users = set()   # 连接进来的websocket客户端集合
  15. @get('/websocket/', apply=[websocket])
  16. def chat(ws):
  17. users.add(ws)
  18. while True:
  19. msg = ws.receive()  # 接客户端的消息
  20. if msg:
  21. for u in users:
  22. u.send(msg) # 发送信息给所有的客户端
  23. else:
  24. break
  25. # 如果有客户端断开连接,则踢出users集合
  26. users.remove(ws)
  27. 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服务端:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. </head>
  5. <style>
  6. #msg{
  7. width:400px; height:400px; overflow:auto; border:2px solid #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.1.221: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('ws://192.168.1.221:8000/websocket/');  这里的192.168.1.221一定要改成你的websocket服务端IP,切记!!!

到这里,就搞定浏览器连接到websocket服务端的场景了,现在要A服务器里写一段代码,去采集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_ip = "192.168.1.10"
  9. r_port = 22
  10. r_log = "/tmp/web_socket.log"   # 远程服务器要被采集的日志路径
  11. # websocket服务端地址
  12. ws_server = "ws://192.168.1.221:8000/websocket/"
  13. # 执行的shell命令(使用ssh远程执行)
  14. 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)
  15. def tailfLog():
  16. """获取远程服务器实时日志,并发送到websocket服务端"""
  17. popen = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
  18. print('连接成功')
  19. ws = create_connection(ws_server)   # 创建websocket连接
  20. while True:
  21. line = popen.stdout.readline().strip()  #获取内容
  22. if line:
  23. ws.send(line)   #把内容发送到websocket服务端
  24. print time.time()
  25. if __name__ == '__main__':
  26. tailfLog()

文章最后再解析subprocess.Popen的原理和功能

执行websocket服务端脚本和上面这个websocket客户端采集脚本,再打开用浏览器打开上面的html5页面后,环境就基本部署好了,双websocket客户端连接到websocket服务端中

上面脚本指定的r_log = "/tmp/web_socket.log"日志路径,我们需要生成这个日志文件,并不停地往里面写入日志,这样才能在浏览器中实时显示效果(真实场景中,可以指定服务器某日志,如apache,nginx日志等)

我们在B服务器写一段python代码,然后每隔一秒就往r_log = "/tmp/web_socket.log"日志中写入内容:

python代码如下:

  1. #!/usr/bin/env python
  2. #coding=utf-8
  3. import time
  4. import random
  5. log_path = '/tmp/web_socket.log'
  6. while 1:
  7. with open(log_path,'a') as f:
  8. f.write('[%s]   %s \n' % (time.ctime(),random.random()))
  9. time.sleep(1)

脚本写入的内容大概是:

[Tue Jul 26 18:30:41 2016] 0.527242649654 
[Tue Jul 26 18:30:42 2016] 0.21080845298 
[Tue Jul 26 18:30:43 2016] 0.23128691356 
[Tue Jul 26 18:30:44 2016] 0.689547600796

执行这段脚本,然后看浏览器效果:

运维开发:python websocket网页实时显示远程服务器日志信息

这只是我临时写的,如果要在真实的运维工具中使用,还需要根据具体情况,修改不少内容,但原理就是这样,大家可根据自己的情况修改,完善使用。

刚才提到subprocess.Popen的原理和功能,请看以下资料:

http://www.cnblogs.com/fengbeihong/articles/3374132.html

bottle websocket参考资料:

http://rfyiamcool.blog.51cto.com/1030776/1269232/

运维开发:python websocket网页实时显示远程服务器日志信息的更多相关文章

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

    功能:用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息 一般我们在运维工具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显示程序日志给开发人员看.你还在用 ...

  2. python实现websocket服务器,可以在web实时显示远程服务器日志

    一.开始的话 使用python简单的实现websocket服务器,可以在浏览器上实时显示远程服务器的日志信息. 之前做了一个web版的发布系统,但没实现在线看日志,每次发布版本后,都需要登录到服务器上 ...

  3. python2&period;7实现websocket服务器,可以在web实时显示远程服务器日志

    一.开始的话 使用python实现websocket服务器,可以在浏览器上实时显示远程服务器的日志. 之前写了一个发布系统,每次发布版本后,为了了解发布情况(进度.是否有错误)都会登录到服务器上查看日 ...

  4. Python 开发个人微信号在运维开发中的使用

    一.主题:Python 开发个人微信号在运维开发中的使用 二.内容: 企业公众号 介绍开发微信公众号的后台逻辑,包括服务器验证逻辑.用户认证逻辑 个人微信号 面对企业微信的种种限制,可以使用 Itch ...

  5. Python运维开发基础09-函数基础【转】

    上节作业回顾 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 实现简单的shell命令sed的替换功能 import ...

  6. Python运维开发基础08-文件基础【转】

    一,文件的其他打开模式 "+"表示可以同时读写某个文件: r+,可读写文件(可读:可写:可追加) w+,写读(不常用) a+,同a(不常用 "U"表示在读取时, ...

  7. Python运维开发基础07-文件基础【转】

    一,文件的基础操作 对文件操作的流程 [x] :打开文件,得到文件句柄并赋值给一个变量 [x] :通过句柄对文件进行操作 [x] :关闭文件 创建初始操作模板文件 [root@localhost sc ...

  8. Python运维开发基础05-语法基础【转】

    上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python # -*- coding:utf-8 -*- # author:Mr.chen import os,time Tag = ...

  9. Python运维开发基础03-语法基础 【转】

    上节作业回顾(讲解+温习60分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen #只用变量和字符串+循环实现“用户登陆 ...

随机推荐

  1. 使用python发送和接收邮件

    关于电子邮件 大学之前,基本不用邮箱,所以基本感觉不到它的存在,也不知道有什么用:然而大学之后,随着认识的人越来越多,知识越来越广泛,邮箱已然成为很重要的通讯工具,大学一些课程作业需要有邮箱发给老师, ...

  2. C&plus;&plus;和java多态的区别

    C++和java多态的区别 分类: Java2015-06-04 21:38 2人阅读 评论(0) 收藏 举报  转载自:http://www.cnblogs.com/plmnko/archive ...

  3. VS2013中BOOST库的环境配置与使用

    &1 安装Boost 文件下载:链接:http://pan.baidu.com/s/1kUKaOFP 密码:auf2 解压之后放到你想安装的文件夹内,我的是在C:\Program Files\ ...

  4. 膜拜acm大牛 虽然我不会这题,但是AC还是没有问题的~(转自hzwer)

    wywcgs: 亦称Lord Wu,俗名吴垠,2009级厦门大学智能科学与技术学院研究生,本科就读于哈尔滨工业大学.因其深厚的算法功底与独到的思维方式,被尊为“吴教主”,至今声威犹存. 2006年起参 ...

  5. C&num;开发COM组件供其他开发环境或工具调用介绍(转)

    由于工作原因涉及到这一块的开发,由于之前并未接触过,所以本篇文章也是在参考了各种资料后,自己实现并通过通过测试之后所整理的备忘录以及一些个人观点. 希望对刚接触这类型开发的朋友有所帮助,若有不足之处还 ...

  6. &lbrack;转&rsqb;Java Web乱码过滤器

    本文转自http://blog.csdn.net/l271640625/article/details/6388690 大家都知道,在jsp里乱码是最让人讨厌的东西,有些乱码出来的莫名其妙,给开发带来 ...

  7. 【通过操作指针&comma;与指针做函数參数&amp&semi;&num;39&semi;实现字串在主串中出现的次数&comma;然后将出现的部分依照要求进行替换 &NewLine;】

    #include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int ...

  8. 最近学习了下BI(商业智能)做报表

    最近公司购买了Style intelligence 出的BI报表工具,接触新的东西不是很容易上手,这个东西是别的项目组用的,我们项目组由于进度比较快就让我先到他们项目组帮他们,为了使用这个东西,他们已 ...

  9. &lbrack;Swift&rsqb;LeetCode243&period;最短单词距离 &dollar; Shortest Word Distance

    Given a list of words and two words word1 and word2, return the shortest distance between these two ...

  10. springboot整合mybatis的两种方式

    https://blog.csdn.net/qq_32719003/article/details/72123917 springboot通过java bean集成通用mapper的两种方式 前言:公 ...