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

日志分析

概述

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

一般采集流程,

日志产出->采集(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(
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的queue模块提供了多种队列实现,包括FIFO(先进先出)队列、LIFO(后进先出)队列和优先级队列。这些队列都是线程安全的,可以在多线程环境下使用。 queue模块中最常用的类是Queue类,它实现了一个FIFO队列。Queue类提供了以下方法: 1. put(item, block=True, timeout=None):将item放入队列中。如果block为True(默认值),并且队列已满,则阻塞直到有空间可用。如果timeout不为None,则阻塞timeout秒,如果还是没有空间可用,则抛出Queue.Full异常。 2. get(block=True, timeout=None):从队列中取出一个元素并返回。如果block为True(默认值),并且队列为空,则阻塞直到有元素可用。如果timeout不为None,则阻塞timeout秒,如果还是没有元素可用,则抛出Queue.Empty异常。 3. qsize():返回队列中的元素个数。 4. empty():如果队列为空,返回True,否则返回False。 5. full():如果队列已满,返回True,否则返回False。 除了Queue类,queue模块还提供了LifoQueue类和PriorityQueue类。LifoQueue类实现了一个LIFO队列,PriorityQueue类实现了一个优先级队列,其中元素按照优先级从小到大排序。 下面是一个使用Queue类的例子: ```python import queue import threading def worker(q): while True: item = q.get() if item is None: break print(item) q.task_done() q = queue.Queue() num_worker_threads = 4 threads = [] for i in range(num_worker_threads): t = threading.Thread(target=worker, args=(q,)) t.start() threads.append(t) for item in range(20): q.put(item) q.join() for i in range(num_worker_threads): q.put(None) for t in threads: t.join() ``` 这个例子中,我们创建了一个Queue对象,并启动了4个线程来处理队列中的元素。主线程向队列中放入20个元素,然后等待队列中的所有元素都被处理完毕。最后,主线程向队列中放入4个None元素,以通知工作线程退出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值