代码如下( 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 = ‘
’
cur.execute(‘select * from log order by value desc limit 20; ‘)
for c in cur.fetchall():
table += ‘
%s %s %s %s ’%c
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
相关文章
- mysql日志通过python发送到rsyslog
- logstash Nginx日志解析
- logstash+kibana3 GeoIP地理位置
- nginx 屏蔽IP段以及设置日志格式
- 将Apache日志实时写入mysql
- Python日志模块 logging
转载请注明:爱开源 » python 日志可视化的进阶
转载请注明:爱开源 » python 日志可视化的进阶