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

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

服务日志格式为:

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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

#!/usr/bin/env python# -*- coding: utf-8 -*-import sysimport jsonfrom collections import Counterfrom mysql import connectorimport datetimetoday = 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 = Nonedef 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脚本:

12345678910111213141516171819202122232425

#!/bin/bash#show all deviceid countsToday=`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')'

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

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

前期

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Python爬虫爬取美剧网站

一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间。之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前...

752
来自专栏醉梦轩

解决Android模拟器中修改IMSI后无法上网问题

1443
来自专栏生信宝典

分子对接简明教程 (4)

文件格式解释 PDB文件 (详细格式描述) 基本信息部分 HEADER记录: 包括分子的分类、提交日期、PDB ID TITLE记录: 为该结构的描述,如果有多...

2067
来自专栏陈满iOS

iOS设备唯一标识符关于UDID代替方案:基于UUID和SSKeychain生成唯一标识符新方法

是一串由40位16进制数组成的字符串,用以标识唯一的设备,现在想通过代码获取是不可能的了,如果你想看看你设备的UDID,可以通过iTunes来查看。

1152
来自专栏FreeBuf

逆向APK进行smali注入实现“秒破WIFI”

近期开始关注手机安全了,以往都是在PC上玩,对这个领域也想了解一下,可是拿什么来开刀呢?突然想起Wifi万能钥匙这个神器了,这个软件的wifi分享模式鄙人非常喜...

2206
来自专栏Crossin的编程教室

Python 爬虫爬取美剧网站

一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间。之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前...

3287
来自专栏我的博客

Mysql命令行操作教程【一】

今天突然有人问我会不会用mysql控制台建立数据库?我犹豫了,您呢? 于是就打算好好研究下mysql控制台命令。平时我们使用phpmyadmin或者navica...

3638
来自专栏py+selenium

跨站脚本攻击(反射型xss)笔记(一)

 payload:  【    ';})</script><script>alert(1)</script>   】

1173
来自专栏帘卷西风的专栏

关于“网游屏蔽字简繁混合”的解决方案

项目最近开始向版署申请版号,反馈的一项修改内容,是聊天屏蔽字库简繁混合未能屏蔽。比如“abc”和“ABC”都能屏蔽,但是类似"AbC”,“aBC”这些不能屏蔽...

623
来自专栏逍遥剑客的游戏开发

MPQ 文件系统完成

1694

扫码关注云+社区