难的是还是就地用JS显示出来相关的发布进度。

还好,花了一下午实现了。

可以移植到项目中去罗。。。

websocket.py:

  1. import tornado.ioloop
  2. import tornado.web
  3. import tornado.websocket
  4. from tornado.ioloop import IOLoop
  5. from datetime import timedelta
  6. import time
  7. import os
  8. import sys
  9. import tornado.httpserver
  10.  
  11. class WebSocketHandler(tornado.websocket.WebSocketHandler):
  12. file_content = ""
  13. filename = "test.log"
  14.  
  15. def open(self):
  16. pass
  17.  
  18. def update_client(self):
  19. self.write_message(self._read_file(self.filename))
  20.  
  21. def on_message(self, message):
  22. print message
  23. self.filename = message.split('-')[1]
  24. self.update_client()
  25.  
  26. def on_close(self):
  27. pass
  28.  
  29. def _read_file(self, filename):
  30. print filename, '================='
  31. with open(filename) as f:
  32. content = f.read()
  33. content_diff = content.replace(self.file_content, '')
  34. self.file_content = content
  35. return content_diff
  36.  
  37. class IndexPageHandler(tornado.web.RequestHandler):
  38. def get(self):
  39. self.render("websockets.html")
  40.  
  41. class Application(tornado.web.Application):
  42. def __init__(self):
  43. handlers = [
  44. (r'/', IndexPageHandler),
  45. (r'/ws', WebSocketHandler)
  46. ]
  47. settings = dict(
  48. template_path=os.path.join(os.path.dirname(__file__), "templates"),
  49. static_path=os.path.join(os.path.dirname(__file__), "static"),
  50. debug=True
  51. )
  52. tornado.web.Application.__init__(self, handlers, **settings)
  53.  
  54. if __name__ == '__main__':
  55. ws_app = Application()
  56. server = tornado.httpserver.HTTPServer(ws_app)
  57. server.listen(8888)
  58. tornado.ioloop.IOLoop.instance().start()

websocket.html:

  1. <title>Tornado WebSockets</title>
  2.  
  3. <link rel="stylesheet" href="/static/uikit-2.22.0/css/uikit.min.css" />
  4. <link rel="stylesheet" href="/static/uikit-2.22.0/css/components/progress.gradient.css"/>
  5. <link rel="stylesheet" href="/static/css/radialindicator.css"/>
  6. <script src="/static/js/jquery-1.11.2.js"></script>
  7. <script src="/static/js/radialIndicator.min.js"></script>
  8. <script src="/static/uikit-2.22.0/js/uikit.js"></script>
  9. <script src="/static/uikit-2.22.0/js/components/sticky.min.js"></script>
  10.  
  11. <div id="procPer"></div>
  12. <br>
  13. <textarea id="logoutput" cols="100" rows="30" placeholder="日志输出" style="background:#000; color:#FFF" >...</textarea>
  14. <br>
  15. <a href="javascript:void(0);" onClick="wsFunc('stop', 'DEMO')"><span id="actionSpn" class="uk-button">停止刷新</span></a>
  16. <script>
  17.  
  18. function GetRequest() {
  19. var url = location.search;
  20. var theRequest = new Object();
  21. if (url.indexOf("?") != -1) {
  22. var str = url.substr(1);
  23. strs = str.split("&");
  24. for(var i = 0; i < strs.length; i ++) {
  25. theRequest[strs[i].split("=")[0]]=unescape(strs[i].split("=")[1]);
  26. }
  27. }
  28. return theRequest;
  29. }
  30. var Request = new Object();
  31. Request = GetRequest();
  32. console.log(Request);
  33. var dev_version = Request['dev_version'];
  34. console.log(dev_version);
  35.  
  36. wsFunc("refresh", dev_version);
  37.  
  38. function wsFunc(msg, dev_version) {
  39. var messageContainer = document.getElementById("logoutput");
  40. var percentContainer = document.getElementById("procPer");
  41.  
  42. if ("WebSocket" in window) {
  43. var ws = new WebSocket("ws://localhost:8888/ws");
  44. ws.onopen = function() {};
  45. ws.onmessage = function (evt) {
  46. messageContainer.innerHTML += evt.data;
  47. var d = messageContainer.scrollHeight;
  48. messageContainer.scrollTop = d;
  49. var pattern = /progress/gi;
  50. var ans = messageContainer.innerHTML.match(/\w+.\w+,\sdeploy\sprogress\s\d+/g);
  51. var dic = new Array();
  52. for (item in ans){
  53. dic_key = ans[item].split(',')[0];
  54. dic_value = ans[item].split(',')[1].split(" ")[3];
  55. dic[dic_key] = dic_value;
  56. }
  57. for (key in dic) {
  58. if(document.getElementById(key + "label") == undefined){
  59. var span=document.createElement('span');
  60. span.setAttribute("id", key + "label");
  61. percentContainer.appendChild(span);
  62. document.getElementById(key + "label").innerHTML = key
  63. }
  64. if(document.getElementById(key) == undefined){
  65. var span=document.createElement('span');
  66. span.setAttribute("id", key);
  67. percentContainer.appendChild(span);
  68. //document.getElementById(key).innerHTML =dic[key];
  69. $(span).radialIndicator({
  70. barColor: {
  71. 10: '#0000FF',
  72. 70: '#0000FF',
  73. 90: '#0000FF',
  74. 100: '#33CC33'
  75. },
  76. radius: 25,
  77. barWidth: 3,
  78. initValue: dic[key],
  79. roundCorner : true,
  80. percentage: true
  81. });
  82. radialObj =$(span).data('radialIndicator');
  83.  
  84. }
  85. radialObj.animate(dic[key]);
  86.  
  87.           
  88. console.log(key, dic[key]);
  89. }
  90.  
  91. };
  92. ws.onclose = function() {};
  93. console.log(msg);
  94. if (msg == "refresh") {
  95. sh=setInterval(function(){
  96. ws.send(msg+"-"+dev_version, function(){})}
  97. ,2000);
  98.  
  99. } else {
  100. clearInterval(sh);
  101. document.getElementById("actionSpn").innerText = 'OutPut';
  102. }
  103. } else {
  104. messageContainer.innerHTML += "此浏览器不支持websocket!";
  105. }
  106. }
  107.  
  108. </script>

样子:

稍微成型点的用WEBSOCKET实现的实时日志LOG输出的更多相关文章

  1. Java用webSocket实现tomcat的日志实时输出到web页面

    原文:http://blog.csdn.net/smile326/article/details/52218264 1.场景需求 后台攻城狮和前端攻城狮一起开发时,经常受到前端攻城狮的骚扰,动不动就来 ...

  2. Java用WebSocket + tail命令实现Web实时日志

    原文:http://blog.csdn.net/xiao__gui/article/details/50041673 在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail - ...

  3. Spring+WebSocket+SockJS实现实时聊天

    设计初衷是通过websocket实现网页实时通讯聊天. 工程环境:tomcat8+jdk1.7+maven+eclipse 设计思路:客户端登录网页建立socket连接,后台记录用户连接信息并做标识: ...

  4. python tornado websocket 实时日志展示

    一.主题:实时展示服务器端动态生成的日志文件 二.流程: 1. 客户端浏览器与服务器建立websocket 链接,服务器挂起保存链接实例,等待新内容触发返回动作 2. 日志服务器脚本循环去发现新内容, ...

  5. 远哥谈 使用WebSocket开发在线实时看远程服务器log日志的工具

    我们开发软件的,通常会有一个测试环境/开发环境,但是系统开发完成后,还会有一个生产环境,也叫正式环境.正式环境我们一般是不能让开发人员去远程登录和维护的,一般正规的生产环境是专门的负责人员去负责更新, ...

  6. websocket 和 ansible配合Tomcat实时日志给前端展示

    业务流程图如下 效果图展示 1.django安装websocket模块 pip install dwebsocket 2.shell脚本 用来传递不同的行号输出不同的内容; 第一个参数为0的时候,默认 ...

  7. Vue+WebSocket 实现页面实时刷新长连接

    最近vue项目要做数据实时刷新,折线图每秒重画一次,数据每0.5秒刷新一次,说白了就是实时刷新,因为数据量较大,用定时器估计页面停留一会就会卡死... 与后台人员讨论过后决定使用h5新增的WebSoc ...

  8. 基于python的websocket开发,tomcat日志web页面实时打印监控案例

    web socket 接收器:webSocket.py 相关依赖 # pip install bottle gevent gevent-websocket argparse from bottle i ...

  9. [PHP] php作为websocket的客户端实时读取推送日志文件

    首先要使用composer来下载一个第三方扩展就可以实现php的websocket客户端,直接在当前目录生成下composer.json文件就可以了composer require textalk/w ...

随机推荐

  1. Beyond Compare 激活解决办法

    问题: 当你使用过一段时间后会提示有问题,需要激活或者什么. 解决办法: 找到这个路径并删除其下Beyond Compare 3文件夹即可正常使用. C:\Users\******\AppData\R ...

  2. Linux学习笔记之Linux相关知识

    [想成为某一方面的大神,没有捷径可走,只能不断的记录.练习.总结.coding……] notes:主要从网上摘录了一些关于Linux的历史以及一些相关内容,以便对Linux系统有一定的了解.这不但可以 ...

  3. 生成自签名ca 证书 使nginx 支持https

    创建服务器私钥,命令会让你输入一个口令:$ openssl genrsa -des3 -out server.key 1024创建签名请求的证书(CSR):$ openssl req -new -ke ...

  4. [C++ STL] 各容器简单介绍

    什么是STL? 1.STL(Standard Template Library),即标准模板库,是一个高效的C++程序库. 2.包含了诸多常用的基本数据结构和基本算法.为广大C++程序员们提供了一个可 ...

  5. [读书笔记3]《C语言嵌入式系统编程修炼》

    第五章 性能优化   5.1 使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法.   写一个"标准"宏MIN ...

  6. DataGridView 动态绑定 CheckBox

    下面演示如何在 DataGridView 中动态绑定 CheckBox: public class Test { /// <summary> /// 构造器 /// </summar ...

  7. jQuery四叶草菜单效果,跟360杀毒软件差不多

    首先,我们要在js,css文件夹中创建js跟css,然后在body中写入html代码 <main><!--标签是 HTML 5 中的新标签. 素中的内容对于文档来说应当是唯一的.它不 ...

  8. JavaScript(十二)事件

    Dom事件 1.DOM0级事件 on事件 只能 监听冒泡阶段 切只能绑定一个事件 dom.onclick = function(){}; 2.Dom2级事件 可以绑定多次事件    可以通过设置fla ...

  9. Spark学习之编程进阶——累加器与广播(5)

    Spark学习之编程进阶--累加器与广播(5) 1. Spark中两种类型的共享变量:累加器(accumulator)与广播变量(broadcast variable).累加器对信息进行聚合,而广播变 ...

  10. get、post、put、delete、head请求方式

    对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不一定要用PUT和DELETE. 一:Jersey框架,实现了restful风格,常用的注解@GET.@POST.@PUT.@DELET ...