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

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

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

websocket.py:

import tornado.ioloop
import tornado.web
import tornado.websocket
from tornado.ioloop import IOLoop
from datetime import timedelta
import time
import os
import sys
import tornado.httpserver

class WebSocketHandler(tornado.websocket.WebSocketHandler):
    file_content = ""
    filename = "test.log"

    def open(self):
        pass

    def update_client(self):
        self.write_message(self._read_file(self.filename))

    def on_message(self, message):
        print message
        self.filename = message.split('-')[1]
        self.update_client()

    def on_close(self):
        pass

    def _read_file(self, filename):
        print filename, '================='
        with open(filename) as f:
            content = f.read()
            content_diff = content.replace(self.file_content, '')
            self.file_content = content
            return content_diff

class IndexPageHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("websockets.html")

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r'/', IndexPageHandler),
            (r'/ws', WebSocketHandler)
        ]
        settings = dict(
            template_path=os.path.join(os.path.dirname(__file__), "templates"),
            static_path=os.path.join(os.path.dirname(__file__), "static"),
            debug=True
        )
        tornado.web.Application.__init__(self, handlers, **settings)

if __name__ == '__main__':
    ws_app = Application()
    server = tornado.httpserver.HTTPServer(ws_app)
    server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

websocket.html:

<title>Tornado WebSockets</title>

<link rel="stylesheet" href="/static/uikit-2.22.0/css/uikit.min.css" />
<link rel="stylesheet" href="/static/uikit-2.22.0/css/components/progress.gradient.css"/>
<link rel="stylesheet" href="/static/css/radialindicator.css"/>
<script src="/static/js/jquery-1.11.2.js"></script>
<script src="/static/js/radialIndicator.min.js"></script>
<script src="/static/uikit-2.22.0/js/uikit.js"></script>
<script src="/static/uikit-2.22.0/js/components/sticky.min.js"></script>

<div id="procPer"></div>
<br>
<textarea id="logoutput" cols="100" rows="30" placeholder="日志输出" style="background:#000; color:#FFF" >...</textarea>
<br>
<a href="javascript:void(0);" onClick="wsFunc('stop', 'DEMO')"><span id="actionSpn"  class="uk-button">停止刷新</span></a>
<script>

function GetRequest() {
       var url = location.search;
       var theRequest = new Object();
       if (url.indexOf("?") != -1) {
          var str = url.substr(1);
          strs = str.split("&");
          for(var i = 0; i < strs.length; i ++) {
             theRequest[strs[i].split("=")[0]]=unescape(strs[i].split("=")[1]);
          }
       }
       return theRequest;
    }
var Request = new Object();
Request = GetRequest();
console.log(Request);
var dev_version = Request['dev_version'];
console.log(dev_version);

wsFunc("refresh", dev_version);

function wsFunc(msg, dev_version) {
        var messageContainer = document.getElementById("logoutput");
        var percentContainer = document.getElementById("procPer");

        if ("WebSocket" in window) {
            var ws = new WebSocket("ws://localhost:8888/ws");
            ws.onopen = function() {};
            ws.onmessage = function (evt) {
                messageContainer.innerHTML += evt.data;
                var d = messageContainer.scrollHeight;
                messageContainer.scrollTop = d;
                var pattern = /progress/gi;
                var ans = messageContainer.innerHTML.match(/\w+.\w+,\sdeploy\sprogress\s\d+/g);
                var dic = new Array();
                for (item in ans){
                    dic_key = ans[item].split(',')[0];
                    dic_value = ans[item].split(',')[1].split(" ")[3];
                    dic[dic_key] = dic_value;
                }
                for (key in dic) {
                    if(document.getElementById(key + "label") == undefined){
                        var span=document.createElement('span');
                        span.setAttribute("id", key + "label");
                        percentContainer.appendChild(span);
                        document.getElementById(key + "label").innerHTML = key
                    }
                    if(document.getElementById(key) == undefined){
                        var span=document.createElement('span');
                        span.setAttribute("id", key);
                        percentContainer.appendChild(span);
                        //document.getElementById(key).innerHTML =dic[key];
                        $(span).radialIndicator({
                                barColor: {
                                    10: '#0000FF',
                                    70: '#0000FF',
                                    90: '#0000FF',
                                    100: '#33CC33'
                                },
                                radius: 25,
                                barWidth: 3,
                                initValue: dic[key],
                                roundCorner : true,
                                percentage: true
                    });
                        radialObj =$(span).data('radialIndicator');

                    }
                    radialObj.animate(dic[key]);

          
                    console.log(key, dic[key]);
                }

            };
            ws.onclose = function() {};
            console.log(msg);
            if (msg == "refresh") {
                sh=setInterval(function(){
                ws.send(msg+"-"+dev_version, function(){})}
                ,2000);

            } else {
                clearInterval(sh);
                document.getElementById("actionSpn").innerText = 'OutPut';
            }
        } else {
            messageContainer.innerHTML += "此浏览器不支持websocket!";
        }
      }

</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. [C++ STL] 各容器简单介绍

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

  2. 237 Delete Node in a Linked List 删除链表的结点

    编写一个函数,在给定单链表一个结点(非尾结点)的情况下,删除该结点. 假设该链表为1 -> 2 -> 3 -> 4 并且给定你链表中第三个值为3的节点,在调用你的函数后,该链表应变为 ...

  3. Ajax学习笔记之一----------第一个Ajax Demo[转载]

    原文地址: http://www.cnblogs.com/pjx412/archive/2011/05/04/2037014.html 一.核心推动力:XMLHttpRequest对象XMLHttpR ...

  4. 喜欢Swift编程语言的人主要是初学者?

    一早一起来,朋友圈除了被苹果发布会刷屏外,还漫天散布着一条类似的招聘消息:“招聘iOS程序员,要求拥有5年的Swift开发经验,有狼性,待遇月薪20K+,专车接送.” 随后身边的朋友很快就开始调侃:& ...

  5. 树莓派zero_w 串口的使用(解决usb可用rxtx不可用的问题)

    2018-06-0212:10:14 查了很多资料,搞了一上午,终于解决了,之前看教程做了树莓派与arduino的通信,GPIO的RXTX测试失败,无奈只能用USB,效果还可以,可是今天我想用RXTX ...

  6. Errors reported here must be corrected before the service can be started

    场景: 安装.配置Apache24时候,最后会给出提示,如图:Errors reported here must be corrected before the service can be star ...

  7. Raspberry Pi开发之旅-控制蜂鸣器演奏乐曲

    一.无源蜂鸣器和有源蜂鸣器 步进电机以及无源蜂鸣器这些都需要脉冲信号才能够驱动,这次尝试用GPIO的PWM接口驱动无源蜂鸣器弹奏一曲<一闪一闪亮晶晶>. 无源蜂鸣器: 无源内部没有震荡源, ...

  8. dbcp数据源配置

    <bean id="dbcpDataSource"  class="org.apache.commons.dbcp.BasicDataSource" de ...

  9. Crash reporter

    A crash reporter is a software application whose function is to identify report crash details and to ...

  10. oracle关闭

    Alert log 要每天查看 abort 关闭冷备会无法使用