文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python 分析设备日志统计在线时间

2023-01-31 02:40

关注

需求:领导要求分析服务日志,计算出各个设备的在线时长,在线率,设备使用率等。

服务日志格式为:

2018-03-01 00:13:52,815 [protocol.handler.1][INFO] - cn.testin.trans.controller.req.script.HeartBeat.deviceLog---{"sdcardWriteable":0,"deviceAction":1,"sdcardAvail":10113417216,"wifiSsid":"testin03_default","rootEnable":0,"deviceid":"863563023966636","networkState":1,"errorMsg":"","minicapEnable":1,"deviceState":1,"romAvail":1655619584,"rpiid":"localhost","networkType":1,"ramAvail":1488954688,"debugMode":1,"errorCount":0,"batteryLevel":100}

以上标红部分:

deviceid: 为设备id, networkState:为网络状态,该值有1、0两个值  deviceState:为设备状态,该值有0、1、2三个值

device_report.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import json
from collections import Counter
from mysql import connector
import datetime
today = datetime.datetime.now().strftime("%Y%m%d")

def execute_sql(insert_sql) :
        try:
                # 配置信息
                config = {
                        'host': '127.0.0.1',
                        'port': 3306,
                        'user': 'analy',
                        'password': '****',
                        'database': 'analy',
                        'charset': 'utf8'
                }
                # 连接
                con = connector.connect(**config)
                cursor = con.cursor()

                # 利用字符串方式查询
                cursor.execute(insert_sql)
                con.commit()                            
   # 关闭
                cursor.close()
                con.close()
        except connector.Error, e:
                print(e)
                print(e.message)

#cur = conn.cursor()
records = None
def device():
    with open(sys.argv[1]) as f:
        for line in f:
#取出日志里的json字符串
            json_origin = line.split('---')[1]
#将json字符串格式化为字典
            json_final = json.loads(json_origin)
            DeviceId = json_final["deviceid"]
            NetworkState = json_final["networkState"]
            DeviceState = json_final["deviceState"]

            yield [DeviceId,NetworkState,DeviceState]

DeviceTotal,NetworkState_0,NetworkState_1,DeviceState_0,DeviceState_1,DeviceState_2 = Counter(), Counter(), Counter(), Counter(), Counter(), Counter()

header = ['deviceid','NetworkState','DeviceState']

for line in device():
    datadict = dict(zip(header,line))
    DeviceTotal[datadict['deviceid']] +=1
    if datadict['NetworkState'] == 0:
        NetworkState_0[datadict['deviceid']] +=1
    elif datadict['NetworkState'] == 1:
        NetworkState_1[datadict['deviceid']] +=1
    if datadict['DeviceState'] == 0:
        DeviceState_0[datadict['deviceid']] +=1
    elif datadict['DeviceState'] == 1:
        DeviceState_1[datadict['deviceid']] +=1
    elif datadict['DeviceState'] == 2:
        DeviceState_2[datadict['deviceid']] +=1

if DeviceTotal:
    for k,v in DeviceTotal.most_common(records):
        data = (today,k, (NetworkState_0[k]/float(v))*100, (NetworkState_1[k]/float(v))*100, (DeviceState_0[k]/float(v))*100, (DeviceState_1[k]/float(v))*100, (DeviceState_2[k]/float(v))*100,((DeviceState_1[k] + DeviceState_0[k])*10))
        query = ("INSERT INTO device_data_report""(date,deviceid,netstate_0_rate,netstate_1_rate,devicestate_0_rate,devicestate_1_rate,devicestate_2_rate,Online_time)" "VALUES('%s','%s','%s','%s','%s','%s','%s','%s')") % data
        execute_sql(query)

此时执行完成,需要不到两分钟。

此前shell脚本:

#!/bin/bash
#show all deviceid counts
Today=`date "+%Y%m%d"`
#FileName='test.txt'
FileName='devicereport'
TempFile='count1.txt'
mysql_sql='mysql -uanaly -p****** '
cat ${FileName} | awk -F'---' '{print $2}' | jq '.deviceid'|sort|uniq -c >> ${TempFile}
for deviceid in `cat ${TempFile}|awk '{print $2}'`
do
   #find networkstate
   netstate_0=`grep $deviceid ${FileName}| awk -F'---' '{print $2}' | jq '.networkState'|grep 0 |wc -l`
   netstate_1=`grep $deviceid ${FileName}| awk -F'---' '{print $2}' | jq '.networkState'|grep 1 |wc -l`
   devicestate_0=`grep $deviceid ${FileName}| awk -F'---' '{print $2}' | jq '.deviceState'|grep 0 |wc -l`
   devicestate_1=`grep $deviceid ${FileName}| awk -F'---' '{print $2}' | jq '.deviceState'|grep 1 |wc -l`
   devicestate_2=`grep $deviceid ${FileName}| awk -F'---' '{print $2}' | jq '.deviceState'|grep 2 |wc -l`
   sumdevice=`grep $deviceid $TempFile|awk '{print $1}'`
#compute rate
   netstate_0_rate=`echo "scale=2;a=(${netstate_0}/${sumdevice})*100;if(length(a)==scale(a)) print 0;print a"|bc`
   netstate_1_rate=`echo "scale=2;a=(${netstate_1}/${sumdevice})*100;if(length(a)==scale(a)) print 0;print a"|bc`
   devicestate_0_rate=`echo "scale=2;a=(${devicestate_0}/${sumdevice})*100;if(length(a)==scale(a)) print 0;print a"|bc`
   devicestate_1_rate=`echo "scale=2;a=(${devicestate_1}/${sumdevice})*100;if(length(a)==scale(a)) print 0;print a"|bc`
   devicestate_2_rate=`echo "scale=2;a=(${devicestate_2}/${sumdevice})*100;if(length(a)==scale(a)) print 0;print a"|bc`
   Online_time=$(((${devicestate_0} + ${devicestate_1})/360))
   ${mysql_sql} -e 'insert into analy.device_data_report (date,deviceid,netstate_0_rate,netstate_1_rate,devicestate_0_rate,devicestate_1_rate,devicestate_2_rate,Online_time) values ('$Today','$deviceid','$netstate_0_rate','$netstate_1_rate','$devicestate_0_rate','$devicestate_1_rate','$devicestate_2_rate','$Online_time')'

此时执行完需要两个多小时。

脚本执行完入库的情况如下图:

blob.png

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯