websocket 和 ansible配合Tomcat实时日志给前端展示
业务流程图如下
效果图展示
1.django安装websocket模块
pip install dwebsocket
2.shell脚本
用来传递不同的行号输出不同的内容;
第一个参数为0的时候,默认输出最后200行内容
第一个参数为其余数字时候,和总行数比较,取差值内容
#!/bin/bash
LOGDIR=/export/Instances/*/*/logs/
LineNum=$1
CatalinaLogFilename=`ls -lrt $LOGDIR | grep catalina.out | tail -1 | awk '{print $NF}'`
LocalhostLogFilename=`ls -lrt $LOGDIR | grep localhost | tail -1 | awk '{print $NF}'`
CatalinaLogFullFilename="${LOGDIR}${CatalinaLogFilename}"
LocalhostLogFullFilename="${LOGDIR}${LocalhostLogFilename}"
#echo $CatalinaLogFullFilename
#echo $LocalhostLogFullFilename
getLogContent(){
wc -l ${CatalinaLogFullFilename} | awk '{print $1}'
echo '###########################Catalina.out#######################################'
/usr/bin/tail -200 ${CatalinaLogFullFilename}
}
if [ -z $LineNum ];then
getLogContent
elif [ $LineNum -eq 0 ];then
getLogContent
else
totalNum=`wc -l ${CatalinaLogFullFilename} | awk '{print $1}'`
let catNum=totalNum-LineNum
if [ $catNum -ne 0 ];then
echo $totalNum
/usr/bin/tail -${catNum} ${CatalinaLogFullFilename}
fi
fi
3.django后台试图函数
views.py对应了/index/websocket_demo/函数处理
应用名字叫做app
from dwebsocket import require_websocket
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
'''websokcet测试函数接收用户发送过来的IP数'''
require_websocket
def websocket_demo(request):
flag = True
# num用作判断是不是第一次请求,取最后200行内容的判断
num = 0
line_num = 0
while flag:
# read方法是非阻塞的方法,所以每3秒收集一次,防止前端挂掉
message = request.websocket.read()
# 客户端发过来的是close的话关闭websocket连接
if message == 'close':
flag = False
# 关闭连接
request.websocket.close()
break
#message = request.websocket.wait()
# 如果客户端没发送数据,就是None,再判断是否num 为1,为1代表第一次读数据已读过
elif not message:
if num != 1:
pass
else:
print '捕获更新日志开始'
from CeleryTasks import ansible_play
instance = ansible_play.Ansible_Playbook(3,[ip,])
print line_num
result = instance.script_shell('/export/App/DevOPS/Python_20160906/CeleryTasks/tomcatLog.sh %s'%line_num)
if result:
line_num = result.split('\n')[0].strip()
request.websocket.send(str(result))
else:
pass
print '捕获更新日志结束'
else:
# 第一次请求取最后200行内容,此时line_num为0
num = 1
ip = message
print '捕获初始日志开始'
#request.websocket.send('return')
from CeleryTasks import ansible_play
instance = ansible_play.Ansible_Playbook(3,[ip,])
print line_num
result = instance.script_shell('/export/App/DevOPS/Python_20160906/CeleryTasks/tomcatLog.sh %s'%line_num)
# print result.split('\n')
line_num = result.split('\n')[0].strip()
# #message = request.websocket.wait()
# #print message
request.websocket.send(str(result))
print '捕获初始日志结束'
# time.sleep(5)
# request.websocket.close()
# break
time.sleep(3)
4.前端页面
$(function() {
t=null;
// connection全局,关闭弹窗作用,websocket关闭操作时候
connection=null;
// 连接成功后,置为true
flag=false;
// 关闭模态框调用的函数
$('#myModal').on('hide.bs.modal',
function() {
//alert('嘿,我听说您喜欢模态框...');
if(t == null){
}else{
clearInterval(t);
}
//clearInterval(t);
$('.modal-footer').empty();
if(connection == null){
}else{
// 关闭websocket连接
connection.send('close');
}
})
});
//pre标签外部的div标签,实现弹窗的滚轮一直在下面
function Setdeep(){
$('.modal-body').scrollTop($('.modal-body')[0].scrollHeight);
}
/*
下面定义一些函数,用做websocket的连接相关
*/
// 发送关闭websocket命令函数
function wsClose () {
connection.send('close');
console.log("Closed");
}
// 收到callback函数回调,插入内容
function wsMessage (event) {
$('.modal-body').find('pre').append('<code class="avrasm">' + event.data + '</code>');
Setdeep();
}
// 连接成功,调用函数回调,flag置为true
function wsOpen (event,ip) {
flag = true;
console.log('Connected to: ' + event.currentTarget.URL);
//connection.send('10.187.109.116');
}
// websocket异常报错console输出
function wsError(event) {
console.log("Error: " + event.data);
}
//Tomcat日志查看清理函数,弹窗
function tomcatLog(ths){
//if( connection == null ){}else{connection.send('close');}
$('#myModal').find('.modal-dialog').removeClass('modal-sm');
$('#myModal').find('.modal-dialog').addClass('modal-lg');
var ip = $(ths).parents('tr').find("td:first").text();
$('#myModal').find('.modal-body').removeClass('hide');
$('#myModal').find('.modal-body').empty();
$('#myModal').find('.modal-body').css("height","750px");
$('.modal-footer').empty();
$('#myModal').find('.modal-body').append('<img src="/static/image/loading.gif"></img>');
$('#myModalLabel').text(ip + ' Tomcat日志');
$('.modal-body').append('<pre>' + '<code class="avrasm">' + '</code>' + '</pre>');
// 建立websocket连接,ws是标签协议,目前nginx上还没更改;
connection = new WebSocket('ws://10.187.196.225:65535/index/websocket_demo/');
connection.onopen = wsOpen;
connection.onclose = wsClose;
connection.onmessage = wsMessage;
connection.onerror = wsError;
// 每2秒判断一下是否成功连接上了
setInterval(function(){
if(flag){
$('.modal-body').find('img').remove();
connection.send(ip);
// 连接置位符置位false,防止频繁发送数据给服务器,主要服务器推数据
flag = false;
$('.modal-footer').append('<button type="button" class="btn btn-danger" onclick="wsClose();buttonDisabled(this);">关闭实时刷新</button>')
$('.modal-footer').append('<button type="button" class="btn btn-default" onclick="dowlandTomcatLog(this);">下载日志文件</button>');
}
},2000);
}
//获取pre标签的中内容给用户下载
function dowlandTomcatLog(ths){
var tomcatLogContent = $('.modal-body').find('pre').first().text();
var blob = stringToBlob(tomcatLogContent);
//var blob = stringToBlob('hello jd.com\r\nhello baidu.com');
download('tomcatLog.txt', blob);
}
/* fileName: 默认下载文件名
blob: 下载Blob对象
*/
function download(fileName, blob){
var aLink = document.createElement('a');
var evt = document.createEvent("MouseEvents");
evt.initEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
aLink.download = fileName;
aLink.href = URL.createObjectURL(blob);
aLink.dispatchEvent(evt);
}
/* 文本转Blob对象 */
function stringToBlob(text) {
var arr_text = text.split("\n");
for (var i = 0;i<arr_text.length;i++){
arr_text[i] = arr_text[i] + '\r\n';
}
var blob = new Blob([arr_text],{type : 'text/html'});
return blob;
}
websocket 和 ansible配合Tomcat实时日志给前端展示的更多相关文章
- Java用WebSocket + tail命令实现Web实时日志
原文:http://blog.csdn.net/xiao__gui/article/details/50041673 在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail - ...
- linux 查看tomcat 实时日志
进入tomcat下logs文件夹下,若没有Catalina.out文件先去启动服务在回到logs文件夹输入 tail -f catalina.out ,可看到实时日志
- Linux如何上查看和退出tomcat实时日志
1.先切换到:cd usr/local/tomcat/logs 目录下 2.tail -f catalina.out Ctrl+c 是退出tail命令. alt+E+R重置.
- Java用webSocket实现tomcat的日志实时输出到web页面
原文:http://blog.csdn.net/smile326/article/details/52218264 1.场景需求 后台攻城狮和前端攻城狮一起开发时,经常受到前端攻城狮的骚扰,动不动就来 ...
- linux下打开、关闭tomcat,实时查看tomcat执行日志
启动:通常是运行sh tomcat/bin/startup.sh 停止:通常是运行sh tomcat/bin/shutdown.sh脚本命令 查看:运行ps -ef |grep tomc ...
- 基于Saltstatck实现页面实时显示tomcat启动日志(17)
一.相关文件 master端: /srv/salt/tomcat/start.sls #tomcat启动服务state.sls,须要自己创建 /srv/salt/tomca ...
- ELK实时日志分析平台环境部署--完整记录
在日常运维工作中,对于系统和业务日志的处理尤为重要.今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例说明,如有误述,敬请指出)~ ==== ...
- ELK(+Redis)-开源实时日志分析平台
################################################################################################### ...
- 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)
我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...
随机推荐
- Java客户端工具选择:HTML?Swing?XML?
整理下面的文章是因为个人觉得写的很好,关于java的客户端了解也并不是太多.看了下面的文章觉得很有必要贴出来,方便自己以后了解java客户端编程. Java软件设计师和管理人员经常会面临这样的难题:在 ...
- jQuery的标签选择器$('p')、类选择器$('.myClass')、id选择器$('#myId')
$()可以是$(expresion),即css选择器 $("a")构造的这个对象,是用CSS选择器构建了一个jQuery对象——它选择了所有的<a/>这个标签 $(&q ...
- 【nginx】nginx解决跨域详解
使用场景:本地运行一个项目,但是要访问外域的api接口,存在跨域问题,解决方式有很多,但我尝试用nginx解决,搜索了网上文章后再加上尝试终于成功, 其中一些注意事项和大家分享一下. 一.window ...
- 【转】命令行浏览器 curl 命令详解,Linux中访问url地址
CURL --- 命令行浏览器 这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑 1)二话不说,先从这里开始吧! curl http://www.yahoo.com 回车之后,www. ...
- linux监控下几个系统工具
1.top 2.htop(yum install -y htop) 3.glances(yum install -y glances) 4.dstat -l -c -m -d -r -n --top ...
- 前段篇:HTML
<!DOCTYPE html> 文件开头统一的标准! HTML包含了两部分: head与body 固定的格式. 一.head部分: head部分分为两部分:meta标签与非meta标签: ...
- 从返回的HTTP Header信息中隐藏Apache的版本号及PHP的X-Powered-By信息
默认情况下,很多apache安装时会显示版本号及操作系统版本,甚至会显示服务器上安装的是什么样的apache模块.这些信息可以为黑客所用,并且黑客还可以从中得知你所配置的服务器上的很多设置都是默认状态 ...
- Ubuntu14.04 安装vmware虚拟机
下载VMware 链接:VMware 14 密码:5okh 移动VMware14 到 /opt #mv VMware-Workstation-Full-14.0.0-6661328.x86_64.b ...
- 为什么说http协议是无状态的?
首先了解基本概念:什么是无状态,什么是无连接 无状态协议: 协议的状态是指下一次传输可以“记住”这次传输信息的能力. http是不会为了下一次连接而维护这次连接所传输的信息,为了保证服务器内存. 比如 ...
- Springboot security cas整合方案-实践篇
承接前文Springboot security cas整合方案-原理篇,请在理解原理的情况下再查看实践篇 maven环境 <dependency> <groupId>org.s ...