Python学习之"/>
Python学习之
日志分析
概述
生成中会生成大量的系统日志,应用程序日志,安全日志等等日志,通过对日志的分析可以了解服务器的负载,键康状况,可以分析客户的分布情况,客户的行为,甚至基于这些分析的时候可以做出预测.
一般采集流程,
日志产出->采集(Logdtash,Flume,Scribe) -> 存储->分析->存储(数据库,NoSQL)->可视化
开源实时日志分析ELK平台
Logstash 收集日志,并存放到ElastcSearch集群中,Kibana则从ES集群中查询数据生成图表,返回浏览器端
数据提取
结构化数据 ---- 数据库为结构化数据
半结构化数据 ----日志等文本,CSV文件
日志是半结构化数据,是有组织的,有格式的数据,可以分割成行和列,就可以当成表理解和处理了,当然也可以分析里面的数据
非结构化数据 音频视频
文本分析
日志是文本文件,需要依赖文件IO,字符串操作,正则表达式等技术 ,通过这些技术就能够把日志中需要的数据提取出来
举例: 现要对日志中形如下面的进行日志分析:
183.60.212.153 - - [19/Feb/2013:10:23:29 +0800] "GET /o2o/media.html?menu=3 HTTP/1.1" 200 16691 "-" "Mozilla/5.0 (compatible; EasouSpider; +.html)"
对字符串出来可以使用字符串的split 进行分割处理,但我们已经学过正则表达式,所以这里使用正则表达式进行字符串的分割处理
import re
logline = '''\
140.205.201.44 - - [07/Apr/2017:08:11:06 +0800] \
"GET / HTTP/1.1" 200 8642 "/"\"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;Alibaba.Security.Heimdall.950384.p)"
'''
regex = repile('(?P<remote>[\d.]{7,}) - - \[(?P<datetime>.*)\] "(?P<method>.+) (?P<url>.+) \
(?P<protocol>.+)" (?P<status>\d{3}) (?P<size>\d+) \"[^"]+" "(?P<useragent>[^"]+)"')
def extract(logline: str) -> dict:m = regex.match(logline)if m:print(m.groups()) # 得到匹配到的值,用分组可以很快的得到所需要的值
print(extract(line))
使用上面的分组就可以提取到所有的分组,就是我们想要的数据。
类型转换
fields中的数据是有类型的,例如时间、状态码等。对不同的field要做不同的类型转换,甚至是自定义的转换
类型转换
fields 中数据是有类型的,在定义日志时,按照一定标准传入到文本中的,因此在后期需要使用时需要进行一定的类型转换,才能为我们所用
一,时间类型转换
# 从日志中匹配到的时间格式为
'19/Feb/2013:10:23:29 +0800 对应格式是%d/%b/%Y:%H:%M:%S %z'
import datetime
def convert_time(timestr):return datetime.datetime.strptime(timestr, '%d/%b/%Y:%H:%M:%S %z')
#其中:使用datetime.datetime.strptime(),在转化时需要一一对应,原文中第一个为days /简写的月份Apr/年......末尾为时区相关
#查看帮助文档可以详细的对应每个时间对应的转化%?
上面的函数为一参函数调用,仅仅是将函数参数进行时间转化这一个操作,故可以简化函数,使用lambda函数;
lambda timestr:datetime.datetime.strptime(timestr,'%d/%b/%Y:%H:%M:%S %z')
同样,日志中其他数据也要进行相同的格式转化,同样不需要创建多个函数,可以创建一个字典,字典的value值为一个函数,这样在匹配字典是就可以调用函数
conversion = {
'datetime': lambda timestr: datetime.datetime.strptime(timestr, '%d/%b/%Y:%H:%M:%S %z'),
'status': int,
'length': int
}
def extract(logline: str) -> dict:m = regex.match(logline)if m:
#方法一 : return {k:conversion.get(k, lambda x:x)(v) for k,v in m.groupdict().items()}
# 这里需要将不存在的k 如何处理,可以使用get的方法,如果不存在则用lambda直接返回值
#方法二 : 通过往字典中增加元素的方法来构建字典if m: for k,v in m.groupdict().items(): # k,v 分别是正则表达式匹配的组中的组名和对应的已匹配值 if k in conversion:d[k] =conversion[k](v) # 将匹配值作为参数传给自店内的函数else:d[k]=v # 不在字典内的函数则直接加入新字典
#方法三: 列表解析式d1 = {conversion[k](v) if k in conversion else v for k,v in m.groupdict(</
更多推荐
Python学习之
发布评论