今日分享内容是基于:Python + Flask 实现接口接收 Disk 信息 来进一步分享如何接收 Nginx Log 的信息。
原理:
通过 Python 调用 Shell 脚本去执行 Nginx Log 的相关命令,然后进行处理再请求 Requests 库来向后端定义好的接口来推送数据并展示。
Part1:收集端
import os
import requests
import json
import time
url="http://10.8.31.61:5555/GetNginxResource"
nginx_data={}
def exec_cmd(logname):
nginx_cmd = "awk -F' ' '{print $21}' " + logname + " |sort |uniq -c"
response = os.popen(nginx_cmd)
nginx_data['data']=str(response.read()).replace("\n","")
#print(nginx_data)
response.close()
return nginx_data
def httpPost(datas):
header = {"Content-Type":"application/json"}
resp_content = requests.post(url=url,data=json.dumps(datas),headers=header)
#resp_content = json.loads(resp_content.content)
print(resp_content.text)
if __name__ == '__main__':
hostname=str(os.popen("hostname |awk -F'.' '{print $1}' |awk -F'-' '{print $2}'").read()).replace("\n","")
while(1):
data=exec_cmd("/home/q/nginx/logs/access_ars2.beta.shangri-la.com.log")
data1=data['data'].split(",")
dict1={}
for i in data1:
data2=i.strip().split(" ")
if(len(data2)>=2):
key,value=data2[1],data2[0]
dict1[key]=value
else:
pass
listkey=['200','204','206','301','302','304','400','401','403','404','415','499','500','503']
dict2={}
for i in listkey:
if(i in dict1.keys()):
dict2[i]=int(dict1[i])
print(dict2)
httpPost(dict(hostname=hostname,nginx_data=dict2))
time.sleep(3600)
Part2:接收端
@resource.route('/GetNginxResource',methods=['POST'])
def GetNginxResource():
'''接收来自linux上传的数据'''
query = request.get_json()
hostname = query["hostname"]
nginx_data = query["nginx_data"]
createtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
sql = 'insert into nginx_log_info (hostname,nginx_data,create_time) VALUES '
data = '("' + hostname + '","' + str(nginx_data) + '","' + str(createtime) + '"'
end = data + ")"
sql = sql + end
print(sql)
db = conndb()
db.execute_sql(sql)
data = {'code': 200, 'message': 'success', 'status': '10000'}
return json.dumps(data)
Part3:展示端
这部分主要分为以下两块内容:
第一块是页面请求
<template>
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<i class="el-icon-lx-cascades"></i> Nginx Log信息
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="container">
<div class="handle-box">
<el-input v-model="query.hostname" placeholder="环境" class="handle-input mr10" clearable @clear="clear_name"></el-input>
<el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
</div>
<el-table
:data="tableData"
border
class="table"
ref="multipleTable"
header-cell-class-name="table-header">
<el-table-column prop="id" label="ID" width="55" align="center"></el-table-column>
<el-table-column prop="hostname" width="150" label="环境"></el-table-column>
<el-table-column prop="nginx_data" width="800" label="nginx log统计信息"></el-table-column>
<el-table-column prop="create_time" label="创建时间"></el-table-column>
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="query.pageIndex"
:page-sizes="[5, 10, 20, 30]"
:page-size="query.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="parseInt(pageTotal)">
</el-pagination>
</div>
</div>
</template>
<script>
import server from '../api/request.js'
export default {
name: 'InterfaceMem',
data () {
return {
query: {
hostname: '',
pageIndex: 1,
pageSize: 10
},
tableData: [],
pageTotal: 0
}
},
created () {
this.getNginxData()
},
methods: {
// 获取后端返回的真实数据
getNginxData () {
server({url: '/getNginxList', data: this.query, method: 'post'})
.then(response => {
console.log('**********')
console.log(response)
this.tableData = response.listdata
console.log(this.tableData)
console.log(this.tableData['nginx_data'])
this.pageTotal = response.pageTotal || 5
})
},
// 触发搜索按钮
handleSearch () {
server({url: '/getNginxList', data: this.query, method: 'post'})
.then(response => {
console.log(response)
this.tableData = response.listdata
console.log(this.tableData)
this.pageTotal = response.pageTotal || 5
})
},
// 分页导航
handleSizeChange (val) {
// console.log(val)
this.$set(this.query, 'pageSize', val)
// console.log(this.query)
this.getNginxData()
},
// 翻页改变页码触发
handleCurrentChange (val) {
this.$set(this.query, 'pageIndex', val)
this.getNginxData()
},
clear_name () {
this.query.hostname = ''
this.getNginxData()
}
}
}
</script>
<style scoped>
.handle-box {
margin-bottom: 20px;
}
.handle-select {
width: 120px;
}
.handle-input {
width: 300px;
display: inline-block;
}
.table {
width: 100%;
font-size: 14px;
}
.red {
color: #ff0000;
}
.mr10 {
margin-right: 10px;
}
.table-td-thumb {
display: block;
margin: auto;
width: 40px;
height: 40px;
}
</style>
第二块是后端请求处理
@resource.route('/getNginxList',methods=['POST'])
def getNginxList():
'''fe的页面列表数据获取'''
query = request.get_json()
print(query)
if (query["hostname"] == ""):
sql1 = "select id,hostname,nginx_data,create_time from nginx_log_info order by id DESC limit " + str(
(query['pageIndex'] - 1) * query["pageSize"]) + "," + str(query["pageSize"])
count_sql = "select count(*) from nginx_log_info"
colume_sql = "select id from nginx_log_info"
else:
sql1 = "select id,hostname,nginx_data,create_time from nginx_log_info where hostname like '%" + str(query["hostname"]) + "%' order by id DESC" + " limit " + str(
(query['pageIndex'] - 1) * query["pageSize"]) + "," + str(query["pageSize"])
count_sql = "select count(*) from nginx_log_info where hostname like '%" + str(query["hostname"]) + "%' order by id DESC"
colume_sql = "select id from nginx_log_info"
sql2 = "select id,hostname,nginx_data,create_time from nginx_log_info"
db = conndb()
listdata = db.get_data(sql1, sql2)
db = conndb()
result = db.get_data(count_sql, colume_sql)
print(result)
pageTotal = result[0]['id']
print(listdata)
print(pageTotal)
data = {'listdata': listdata, "pageTotal": pageTotal, "code": 200}
return json.dumps(data)
Part4:页面展示
欢迎关注【无量测试之道】公众号,回复【领取资源】
Python+Unittest框架API自动化、
Python+Unittest框架API自动化、
Python+Pytest框架API自动化、
Python+Pandas+Pyecharts大数据分析、
Python+Selenium框架Web的UI自动化、
Python+Appium框架APP的UI自动化、
Python编程学习资源干货、
资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。
备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。
包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。
微信搜索公众号:“无量测试之道”,或扫描下方二维码:
添加关注,让我们一起共同成长!