如何将服务端log实时在页面输出展示

2024-05-18 19:55

1. 如何将服务端log实时在页面输出展示

在部署状态页面点击查看日志,将会打开日志页面,下个图就是日志的输出页面。

简约时尚小清新的日志页面出来了,是不是很想一个terminal,有没有觉得俺弄的页面很漂亮。哈哈哈哈,写不好前端的运维不是好DBA。

刚开始拿到这个需求,咋觉得很难。因为在服务器上我们看一个日志,经常会tail -f 看着刷屏的感觉倍爽。如何在web页面上实现tailf的效果呢?
后来想想这样实现是可行的。前端写一个js定时器,不断的发ajax请求到后台,每回取出一段日志。后台取日志可以直接调用系统命令,或者直接调取shell脚本,取日志,判断日志文件是否存在,是否为空,返回数据的起始位置等,都可以交给shell来做。事实上我就是这么干的。后台程序写一堆shell命令调用有点别扭。想到解决方案之后,实现的过程就比较简单了。我的开发环境是基于python的Django框架来做的,现在就展示这个功能的实现过程。
Django部分
点击查看日志的链接之后会调到views里的ajxGetLog方法,该方法需要两个参数,项目id和主机id,这两个参数主要是用来确定日志文件的位置。该方法返回行号。
execcommand是封装的一个subprocess.Popen的一个工具函数,返回一个列表分别是标准输出,错误输出和shell returncode
def ajxGetLog(request,pid,hid): 
    project = Project.objects.get(pk=pid) 
    host = Host.objects.get(pk=hid) 
    scriptname = '%s%s'%(base_path,'get_log.sh') 
    res = execcommand(['sh',scriptname,host.hostname,project.servicename]) 
    #如果错误输出不为空,直接返回错误输出 
    if not res[1]: 
        try: 
            #res[0]为行号,如果大于20行,从当前行的上面20行开始输出,为了用户体验,你懂得 
            if int(res[0]) > 20: 
                line = int(res[0]) - 20
            if int(res[0]) == 0: 
                line = 1
            return render(request,'logs.html',{'pid':pid,'hid':hid,'line':line}) 
        except Exception,e: 
            print e 
            return HttpResponse(e) 
    else: 
        return HttpResponse(res[1])
html部分首席写一个ajax请求,传递到后台取日志内容的方法,传递三个参数项目id,主机id,和行号,后台将会返回对应行号的日志内容。该方法代码如下:
 def ajxGetLogHandle(request,pid,hid,line): 
    project = Project.objects.get(pk=pid) 
    host = Host.objects.get(pk=hid) 
    scriptname = '%s%s'%(base_path,'get_log.sh') 
    res = execcommand(['sh',scriptname,host.hostname,project.servicename,line])  
    if not res[1] and res[0].strip(): 
        return HttpResponse(res[0]) 
    else: 
        return HttpResponse(500)

如何将服务端log实时在页面输出展示

2. 如何把Tomcat的日志实时输出到Web页面上

前端写一个js定时器,不断的发ajax请求到后台,每回取出一段日志。后台取日志可以直接调用系统命令,或者直接调取shell脚本,取日志,判断日志文件是否存在,是否为空,返回数据的起始位置等,都可以交给shell来做。事实上我就是这么干的。后台程序写一堆shell命令调用有点别扭。想到解决方案之后,实现的过程就比较简单了。我的开发环境是基于python的Django框架来做的,现在就展示这个功能的实现过程。

Django部分

点击查看日志的链接之后会调到views里的ajxGetLog方法,该方法需要两个参数,项目id和主机id,这两个参数主要是用来确定日志文件的位置。该方法返回行号。

execcommand是封装的一个subprocess.Popen的一个工具函数,返回一个列表分别是标准输出,错误输出和shell returncode

def ajxGetLog(request,pid,hid): 
    project = Project.objects.get(pk=pid) 
    host = Host.objects.get(pk=hid) 
    scriptname = '%s%s'%(base_path,'get_log.sh') 
    res = execcommand(['sh',scriptname,host.hostname,project.servicename]) 
    #如果错误输出不为空,直接返回错误输出 
    if not res[1]: 
        try: 
            #res[0]为行号,如果大于20行,从当前行的上面20行开始输出,为了用户体验,你懂得 
            if int(res[0]) > 20: 
                line = int(res[0]) - 20
            if int(res[0]) == 0: 
                line = 1
            return render(request,'logs.html',{'pid':pid,'hid':hid,'line':line}) 
        except Exception,e: 
            print e 
            return HttpResponse(e) 
    else: 
        return HttpResponse(res[1])

html部分首席写一个ajax请求,传递到后台取日志内容的方法,传递三个参数项目id,主机id,和行号,后台将会返回对应行号的日志内容。该方法代码如下:
 def ajxGetLogHandle(request,pid,hid,line): 
    project = Project.objects.get(pk=pid) 
    host = Host.objects.get(pk=hid) 
    scriptname = '%s%s'%(base_path,'get_log.sh') 
    res = execcommand(['sh',scriptname,host.hostname,project.servicename,line])  
    if not res[1] and res[0].strip(): 
        return HttpResponse(res[0]) 
    else: 
        return HttpResponse(500)

Shell部分
实现返回行号和返回日志内容的功能是一个shell脚本,上shell
看到shell 是不是很亲切,现在知道传递的两个参数的作用了吧,host 和 项目id就是为了确定日志文件的路径,如果命令行参数没有传递行号就返回行号,如果有行号,就返回该行内容。
#!/bin/bash 
set -e 
HOST=$1 
SERVICENAME=$2 
LINENUM=$3 
LOGFILE="/opt/$SERVICENAME/logs/catalina.out"
if [ $LINENUM ];then
    ssh -A -T root@$HOST "sed -n ${LINENUM}p $LOGFILE"
else
    ssh -A -T root@$HOST "wc -l $LOGFILE|awk '{print \$1}'"
fi

3. 嵌入式数据采集设备适合用python+django做web界面吗

感觉应该用qt啥的吧

嵌入式数据采集设备适合用python+django做web界面吗

4. 如何用Python+django开发网站 10分钟內作出一个blog例子

先说下python程序是怎么和页面扯上关系的: 1、页面的展示是需要html来编写的 a、python是怎么让别人看到你写的页面的?在本机上直接双击打开就能看见了,但要在网络

5. Python Django框架,如何通过某一工具获取数据库数据,然后绘图,将可视化成果展现在搭建好的WEB页面上

怎么获取数据库数据属于Django ORM部分的基础知识,请看Django官网教程,如果看不懂英文可以看自强学堂的Model部分教程,虽然远不如官网详尽,至少能让你知道ORM是什么、怎么用。
怎么将数据可视化到页面上属于前端知识,和你的数据类型、数据量、展现形式、期望效果、选用的前端框架以及UI框架都有关系,问题太宽泛不好回答。

Python Django框架,如何通过某一工具获取数据库数据,然后绘图,将可视化成果展现在搭建好的WEB页面上

6. weblogic能部署python+Django开发的web应用吗

不行的。

Weblogic是专门针对JAVA虚拟机的中间件,目前由Oracle开发,每年许可费用比较高。它是用来解析 JSP 网站,只能用 JAVA 语言 的web网站,需要将源代码编译成 jar 包。类似的软件还有 tomcat, jeety, jboss等等。
Django 是 Python 语言的web开发框架,本身是一种脚本语言,不需要手工编译。一般使用 WSGI 类的代码让其转换到前端web服务器(如Apache/Nginx)。常用的WSGI方法有 fast_cgi/flup/uwsgi等,目前应该uwsgi使用得更多,支持多线程。

7. 如何在Python web django中显示css样式呢?

在 template 的html文件的头部 做 css样式的引入,或者在新建页面(html)的时候(你可能引用template 或者不使用),在新建页面的 头部 引入css样式。
简单来说,就和你普通html 网页引入css样式一样的方式

如何在Python web django中显示css样式呢?

8. python + django 如何做到一个标签在一定时间内显示

用自定义标签,这样逻辑就转到后台编写了,然后你后台做个日期判断,返回一个HTML字符串就好了,大概是:
 
if 当前时间在9月1日到3号之间:
     return   输出时间
else:
    return ""
这样就好了,很久没用了,不然都可以给你写一个。最近有空我帮你研究一下