最新消息:

python 日志可视化的进阶

python admin 4862浏览 0评论

代码如下( talk is cheap, show me the money code!)

# coding=utf-8

f = open(‘www_access_20140823.log’) res = {}for l in f: arr = l.split(‘ ‘)

# 获取ip url 和status ip = arr[0] url = arr[6] status = arr[8]

# ip url 和status当key,每次统计+1 res[(ip,url,status)] = res.get((ip,url,status),0)+1

# 生成一个临时的list

res_list = [(k[0],k[1],k[2],v) for k,v in res.items()]

# 按照统计数量排序,打印前10

for k in sorted(res_list,key=lambda x:x[3],reverse=True)[:10]:

print k

 

处理结果

(‘222.86.153.12’, ‘/images/cursor_minify.cur’, ‘404’, 60)

(‘222.86.153.12’, ‘/images/cursor_zoom.cur’, ‘404’, 32)

(‘58.253.6.133’, ‘/images/cursor_minify.cur’, ‘404’, 32)

(‘111.85.34.165’, ‘/%3Ca%20href=’, ‘404’, 28)

(‘58.253.6.133’, ‘/images/cursor_zoom.cur’, ‘404’, 27)

(‘218.29.111.117’, ‘/images/cursor_zoom.cur’, ‘404’, 27)

(‘218.29.111.117’, ‘/images/cursor_minify.cur’, ‘404’, 26)

(‘117.63.146.40’, ‘/public/js/common.js?20110824’, ‘200’, 19)

(‘117.63.146.40’, ‘/favicon.ico’, ‘404’, 18)

(‘117.63.146.40’, ‘/public/js/weibo.js?20110824’, ‘200’, 16)

任务完成

  • 下一步粘到邮件里,或者生成一个csv文件发出去
  • 然而这是一个看脸的社会,运维也逃脱不了这个魔咒

级别2


  • 浏览器端展现——生成list之后,拼接sql,存入数据库

代码如下( talk is cheap, show me the money code!)

import MySQLdb as mysql

con = mysql.connect(user=’root’,\

passwd=”,\

db=’log’,\

host=’localhost’)

con.autocommit(True)

cur = con.cursor()

# 处理文件省略

for s in res_list:

sql = ‘insert log values (“%s”,”%s”,%s,%s)’ % s

try:

# 入库

cur.execute(sql)

except Exception, e:

pass

  • 前端展现——读库 展现页面

代码如下( talk is cheap, show me the money code!)

from flask import Flask,request,render_template

app = Flask(__name__)

import MySQLdb as mysql

con = mysql.connect(user=’xx’,\

passwd=’xx’,\

db=’xx’)

cur = con.cursor()

@app.route(‘/’)

def index():

table = ‘<table border=”1″>’

cur.execute(‘select * from log order by value desc limit 20; ‘)

for c in cur.fetchall():

table += ‘<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>’%c

table +='</table>’

return table

if __name__ == ‘__main__’:

app.run(host=’0.0.0.0′,port=9092)

给老板一个url即可,老板想看随时能看

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::0

但是老板表示有点丑

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::1

完整的思路


::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::2

  • 前端展现上做一些优化

  • 分页
  • 表格排序
  • 搜索
  • 控制每页显示数量
  • 数据多了之后,前端交互和后端数据的接口配合

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::3

我们的console页面,提供几个汇总信息,那就更好啦

比如根据http的status来个汇总

难不倒我 一句sql搞定

select status,sum(value) from log group by status

+——–+————+

| status | sum(value) |

+——–+————+

| 200 | 15529 |

| 206 | 6 |

| 301 | 2 |

| 304 | 3549 |

| 403 | 1 |

| 404 | 847 |

+——–+————+

6 rows in set (0.02 sec)

汇总信息可视化


  • 根据https状态汇总

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::4

  • 其他功能

  • 图例开关
  • 图表转换
  • 数据视图
  • 直接导出图片
  • 可视化并不仅限于此

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::5

上面只是举的小例子。

如果你对时间更感兴趣,我们的log里也是有时间信息的,可以像下面这样

统计量,时间轴拖动,保存图片,etc

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::6

更进一步


如何让日志数据更加一目了然,让老板觉得你很有逼格呢?

IP都是有地址位置的,定位每个ip的位置,画个地图出来汇总

经纬度坐标系统

  • 地球坐标(WGS84)
    • 国际标准,从 GPS 设备中取出的数据的坐标系
    • 国际地图提供商使用的坐标系
  • 火星坐标(GCJ-02)
    • 中国标准,从国行移动设备中定位获取的坐标数据使用这个坐标系
  • 百度坐标(BD-09)
    • 百度标准,百度 SDK,百度地图,Geocoding 使用

应用场景

  • WGS84坐标系:

    • 国际标准,谷歌国外地图、osm地图等国外的地图一般都是这个
  • 火星坐标系:
    • iOS 地图
    • Gogole地图
    • 搜搜、阿里云、高德地图
  • 百度坐标系:
    • 当然只有百度地图

地图是需要经纬度的,用第三方的ip库转换一下

http://developer.baidu.com/map/index.php?title=webapi/ip-api

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::7

代码如下( talk is cheap, show me the money code!)

import urllib2

import json

key = ‘q5mTrTGzCSVq5QmGpI9y18Bo’

ipurl = ‘http://api.map.baidu.com/location/ip?ak=’+key+’&coor=bd09ll&ip=’

sqlarr = []

def getGeo(ip):

try:

u = urllib2.urlopen(ipurl+ip)

page = json.load(u)

if ‘content’ in page:

point = page[‘content’].get(‘point’)

print ‘ip %s has geoX %s and geoY %s’ % (ip,point[‘x’],point[‘y’])

except:

print ‘error’

getGeo(‘202.198.16.3’)

# ip 202.198.16.3 has geoX 125.31364243 and geoY 43.89833761

举多个例子


就想玩网游时候,坐标可以定位一个人,经纬度可以再地图上定位一个点,画图展现如下:

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::8

刚才那个图仅关注区域,进阶一下,还要关注访问量

可以根据value筛选

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::9

 

进阶:多台机器的日志


  • 获取每个机器的hostname和ip,和日志数据一起存在数据库里
  • 一个表存日志,带上一个机器的id
  • 机器的id=>ip和经纬度
  • 最终统计访问量

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::10

 

后续扩展


  • 日志数据
  • 前端展现场景

怎么实践

  • 这次分享的主题关注与可视化
  • 我们用了一个很小的静态日志,目的是说明可视化的思路
  • 实际工作中日志数据应该怎么处理

ELK


 

Logstash+ElasticSearch+Kibana4

  • logstash
    • 日志进行收集、分析,并将其存储供使用
  • ElasticSearch
    • 开源分布式搜索引擎,
  • Kibana4
    • 日志分析友好的 Web 界面
  • 其他
    • Kafka scribe等

 

常见日志处理架构

  • ELK
  • logstash+Hadoop
  • scribe+hadoop
  • 线上数据->Flume->Kafka->Hdfs->Map/Reduce
  • 线上数据->flume->kafka->storm
  • 在上面的基础上定制化二次开发,比如MR平台上写代码,我们的代码就可以直接拿来用
  • 日志的数据处理架构详情,请见下回分解

前端展现场景


  • 展现逼格更高一些,数据一样,效果更好
  • 运维人员权限树
  • 流量图
  • 年终数据统计
  • 区域点击统计图
  • 3D机房

大家具体需要哪个,可以继续扩展。先给大家展现几个假数据的demo:

  • 高逼格饼图展示状态汇总(假数据,可以替换为http_status)

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::11

  • 人员权限树(假数据,可以作为运维人员权限展示)

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::12

  • 日志统计汇总(假数据,可以用来展示年日志数据汇总)

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::13

  • 区域数据汇总饼图展示(假数据,可选择省份,生成饼图)

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::14

  • 3D展示机房(网上盗图,后续会做一个类似的开源)

json生成,实时查看机器状态,点击时间

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::15

  • 3D展示不止于此 有图有XX

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::16

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::17

::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::18

转载请注明:爱开源 » python 日志可视化的进阶

您必须 登录 才能发表评论!