Python学习之 ---日志分析+数据分发与分析+多线程+queue模块+日志分析综合

这篇博客介绍了如何利用Python进行日志分析,包括日志概述、数据提取方法,特别是文本分析和正则表达式的应用。接着讨论了数据分发和处理流程,提出了使用queue模块进行数据缓冲和解耦,并提到了多线程在数据处理中的作用。此外,文章还提及了数据处理所需模块和分析器的设计,为日志数据的进一步可视化和分析奠定了基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日志分析

概述

生成中会生成大量的系统日志,应用程序日志,安全日志等等日志,通过对日志的分析可以了解服务器的负载,键康状况,可以分析客户的分布情况,客户的行为,甚至基于这些分析的时候可以做出预测.

一般采集流程,

日志产出->采集(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; +http://www.easou.com/search/spider.html)" 

对字符串出来可以使用字符串的split 进行分割处理,但我们已经学过正则表达式,所以这里使用正则表达式进行字符串的分割处理

import re
logline  =  '''\
140.205.201.44 - - [07/Apr/2017:08:11:06 +0800] \
"GET / HTTP/1.1" 200 8642 "http://job.magedu.com/"\
 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;Alibaba.Security.Heimdall.950384.p)"
'''
regex = re.compile('(?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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值