Python学习之

编程入门 行业动态 更新时间:2024-10-06 18:21:12

<a href=https://www.elefans.com/category/jswz/34/1770869.html style=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学习之

本文发布于:2024-02-14 03:06:10,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1761779.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!