稍微成型点的用WEBSOCKET实现的实时日志LOG输出
难的是还是就地用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输出的更多相关文章
- Java用webSocket实现tomcat的日志实时输出到web页面
原文:http://blog.csdn.net/smile326/article/details/52218264 1.场景需求 后台攻城狮和前端攻城狮一起开发时,经常受到前端攻城狮的骚扰,动不动就来 ...
- Java用WebSocket + tail命令实现Web实时日志
原文:http://blog.csdn.net/xiao__gui/article/details/50041673 在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail - ...
- Spring+WebSocket+SockJS实现实时聊天
设计初衷是通过websocket实现网页实时通讯聊天. 工程环境:tomcat8+jdk1.7+maven+eclipse 设计思路:客户端登录网页建立socket连接,后台记录用户连接信息并做标识: ...
- python tornado websocket 实时日志展示
一.主题:实时展示服务器端动态生成的日志文件 二.流程: 1. 客户端浏览器与服务器建立websocket 链接,服务器挂起保存链接实例,等待新内容触发返回动作 2. 日志服务器脚本循环去发现新内容, ...
- 远哥谈 使用WebSocket开发在线实时看远程服务器log日志的工具
我们开发软件的,通常会有一个测试环境/开发环境,但是系统开发完成后,还会有一个生产环境,也叫正式环境.正式环境我们一般是不能让开发人员去远程登录和维护的,一般正规的生产环境是专门的负责人员去负责更新, ...
- websocket 和 ansible配合Tomcat实时日志给前端展示
业务流程图如下 效果图展示 1.django安装websocket模块 pip install dwebsocket 2.shell脚本 用来传递不同的行号输出不同的内容; 第一个参数为0的时候,默认 ...
- Vue+WebSocket 实现页面实时刷新长连接
最近vue项目要做数据实时刷新,折线图每秒重画一次,数据每0.5秒刷新一次,说白了就是实时刷新,因为数据量较大,用定时器估计页面停留一会就会卡死... 与后台人员讨论过后决定使用h5新增的WebSoc ...
- 基于python的websocket开发,tomcat日志web页面实时打印监控案例
web socket 接收器:webSocket.py 相关依赖 # pip install bottle gevent gevent-websocket argparse from bottle i ...
- [PHP] php作为websocket的客户端实时读取推送日志文件
首先要使用composer来下载一个第三方扩展就可以实现php的websocket客户端,直接在当前目录生成下composer.json文件就可以了composer require textalk/w ...
随机推荐
- Beyond Compare 激活解决办法
问题: 当你使用过一段时间后会提示有问题,需要激活或者什么. 解决办法: 找到这个路径并删除其下Beyond Compare 3文件夹即可正常使用. C:\Users\******\AppData\R ...
- Linux学习笔记之Linux相关知识
[想成为某一方面的大神,没有捷径可走,只能不断的记录.练习.总结.coding……] notes:主要从网上摘录了一些关于Linux的历史以及一些相关内容,以便对Linux系统有一定的了解.这不但可以 ...
- 生成自签名ca 证书 使nginx 支持https
创建服务器私钥,命令会让你输入一个口令:$ openssl genrsa -des3 -out server.key 1024创建签名请求的证书(CSR):$ openssl req -new -ke ...
- [C++ STL] 各容器简单介绍
什么是STL? 1.STL(Standard Template Library),即标准模板库,是一个高效的C++程序库. 2.包含了诸多常用的基本数据结构和基本算法.为广大C++程序员们提供了一个可 ...
- [读书笔记3]《C语言嵌入式系统编程修炼》
第五章 性能优化 5.1 使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法. 写一个"标准"宏MIN ...
- DataGridView 动态绑定 CheckBox
下面演示如何在 DataGridView 中动态绑定 CheckBox: public class Test { /// <summary> /// 构造器 /// </summar ...
- jQuery四叶草菜单效果,跟360杀毒软件差不多
首先,我们要在js,css文件夹中创建js跟css,然后在body中写入html代码 <main><!--标签是 HTML 5 中的新标签. 素中的内容对于文档来说应当是唯一的.它不 ...
- JavaScript(十二)事件
Dom事件 1.DOM0级事件 on事件 只能 监听冒泡阶段 切只能绑定一个事件 dom.onclick = function(){}; 2.Dom2级事件 可以绑定多次事件 可以通过设置fla ...
- Spark学习之编程进阶——累加器与广播(5)
Spark学习之编程进阶--累加器与广播(5) 1. Spark中两种类型的共享变量:累加器(accumulator)与广播变量(broadcast variable).累加器对信息进行聚合,而广播变 ...
- get、post、put、delete、head请求方式
对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不一定要用PUT和DELETE. 一:Jersey框架,实现了restful风格,常用的注解@GET.@POST.@PUT.@DELET ...