稍微成型点的用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.httpserverclass WebSocketHandler(tornado.websocket.WebSocketHandler):file_content = ""filename = "test.log"def open(self):passdef update_client(self):self.write_message(self._read_file(self.filename))def on_message(self, message):print messageself.filename = message.split('-')[1]self.update_client()def on_close(self):passdef _read_file(self, filename):print filename, '================='with open(filename) as f:content = f.read()content_diff = content.replace(self.file_content, '')self.file_content = contentreturn content_diffclass 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>

样子:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一些常用的SAS命令

一些常用的SAS命令 1. 转换文本数据文件的数据步的一般形式为&#xff1a; data 数据集名&#xff1b;infile 文件名&#xff1b; input 变量输入设定&#xff1b; run&#xff1b; 2. 指定逻辑文件名语句的一般形式为&#xff1a;filename 逻辑文件名 ‘文件位置’&#xff…

.NET6之MiniAPI(四):配置

配置文件&#xff0c;是一个每个应用服务程序常用的功能&#xff0c;从原来的终端应用时代&#xff0c;到现在的元宇宙时代&#xff0c;配置都是很悠然自得的存在。asp.net core提供了强大的配置文件访问机制&#xff0c;不管是MVC API还是MiniAPI&#xff0c;使用方式都是相同…

LeetCode:Sudoku Solver Valid Sudouku

其实数独还是我挺喜欢的一个游戏。原来有本数独的书。 其实Sudoku是基于Valid Sudouku.其实一开始有点想太多。基于平常玩数独的经验&#xff0c;有很多解数独的规则。貌似这个人为判断因素比较多。 而且一开始理解的valid是有解无解&#xff0c;其实这里要求的是给定的board里…

Ubuntu之SVN客户端安装+使用

下载SVN 我们先使用sudo apt-get source sudo apt-get update 然后下载svn sudo apt-get install subversion 一步继续一步,每次y 安装成功之后 svn --version查看。 使用 2、 新建一个目录,cd 到新建目录下,将文件 checkout 到本地目录:svn checkout svn://192.168.1…

《SAS编程与数据挖掘商业案例》学习笔记之十一

继续读书笔记&#xff0c;本文重点侧重sas观测值的操作方面&#xff0c; 主要包括&#xff1a;输出观测值、更新观测值、删除观测值、停止输出观测值等 1.output语句 输出当前在pdv中的观测值&#xff0c;继续无条件执行下面的语句。 注意&#xff1a;简单的data步不需要outp…

【1】淘宝sdk装修入门引言

淘宝sdk开发者要具备的一些要求&#xff1a;【1】photoshop图像处理能力【2】html常用标签的基础知识【3】htmlcss布局的基础知识【4】简单的php输出语句【5】对淘宝装修的一些基本了解淘宝sdk的开发流程&#xff1a;【1】设计平面效果图【2】创建本地模板文件【3】创建自定义设…

基于嵌入式webserver的服务器状态监控

其实也是在easyhadoop做第二次重构的时候用到了这个嵌入式的webserver去做服务器状态的监控&#xff0c;可以单独摘出来写个东西。思路主要是用python脚本获取linux服务器的各种状态信息&#xff0c;然后用webserver的方式&#xff0c;以json数据发给http&#xff0c;主控节点去…

Yii框架里用grid.CGridView调用pager扩展不显示最后一页按钮的解决

有如下一例,调用zii.widgets.grid.CGridView显示Blog信息&#xff0c;代码如下&#xff1a; 1 $this->widget(zii.widgets.grid.CGridView, 2 array(3 id>blog-grid,4 dataProvider>$model->search(),5 filter>$model,6 pa…

.NET 6新特性试用 | PeriodicTimer

前言在.NET中&#xff0c;已经存在了5个Timer类&#xff1a;System.Threading.TimerSystem.Timers.TimerSystem.Web.UI.TimerSystem.Windows.Forms.TimerSystem.Windows.Threading.DispatcherTimer不管以前这样设计的原因&#xff0c;现在.NET 6又为我们增加了一个新Timer&…

shell--指“提供使用者使用界面”的软件(命令解析器)

在计算机科学中&#xff0c;Shell俗称壳&#xff08;用来区别于核&#xff09;&#xff0c; 是指“提供使用者使用界面”的软件&#xff08;命令解析器&#xff09;。 它类似于DOS下的command.com。它接收用户命令&#xff0c;然后调用相应的应用程序。同时它又是一种程序设计语…

《SAS编程与数据挖掘商业案例》学习笔记之十三

本次重点&#xff1a;data步循环与控制 涉及&#xff1a;if/then/else语句&#xff0c;select语句&#xff0c;do语句&#xff0c;continue语句&#xff0c;leave语句 1.if then else 语句 高效率的if应用&#xff1a; 1&#xff09; If x1 then y1; Else if x2 then y2; Els…

ChatForFun 公众号使用说明

使用方法 2016-07-16 DennisMi ChatForFun1&#xff0c;发送 #1 实现登陆&#xff0c;或者退出登陆 2&#xff0c;发送 #2 实现加入聊天&#xff0c;和退出聊天 3&#xff0c;聊天开始后&#xff0c;可以直接发送消息 4&#xff0c;如果需要退出登陆或者退出聊天&#xff0c;…

sessionfunctionphp实战第六天

最近研究sessionfunction&#xff0c;稍微总结一下&#xff0c;以后继续补充&#xff1a; 今天学习了做后台页面&#xff0c;很失败就不展示了。 php方面&#xff1a;以下代码可以屏蔽php注意级别的错误&#xff0c;即 抛出任何非注意错误 error_reporting(E_ALL&~E_NOTICE…

利用WebBrowser实现Web打印的分析

利用WebBrowser实现Web打印的分析 原文:利用WebBrowser实现Web打印的分析WebBrowser是IE内置的浏览器控件&#xff0c;无需用户下载。本文档所讨论的是有关IE6.0版本的WebBrowser控件技术内容。其他版本的IE应该也支持。与其相关的技术要求有&#xff1a;打印文档的生成、页面设…

强大的grep命令

强大的grep命令网上关于grep命令的解释一搜一大堆&#xff0c;基本都是把man命令大致翻译了一下&#xff0c;说实话&#xff0c;看完就忘&#xff01;个人认为&#xff0c;学习命令最好的方式就是模拟真实环境&#xff0c;写出一些可能用到的命令组合&#xff0c;然后慢慢消化&…

.NET 6新特性试用 | 总结:我最喜欢的5个特性

前言不知不觉&#xff0c;《.NET 6新特性试用》系列文章已经写了20多篇&#xff0c;而今天终于要告一段落了。如果你还没有看过&#xff0c;详细文章列表在这里&#xff1a;.NET 6新特性试用系列在这么多特性中&#xff0c;我最喜欢如下5个特性&#xff1a;1、最小Web API仅需三…

《SAS编程与数据挖掘商业案例》学习笔记之十二

本次重点在&#xff1a;sas数据集管理 主要包括&#xff1a;包括数据集纵向拼接、转置、排序、比较、复制、重命名、删除等 1.append语句 注&#xff1a;base数据集和data两个数据集必须结构一样&#xff0c;避免使用force的情况&#xff0c;重复append的会造成重复。 一个避…