Python日志分析与正则表达式

程序员经常会面临日志的分析工作。而正则表达式是处理日志的必备工具。

“Line 622: 01-01 09:04:16.727 <6> [pid:14399, cpu1 dabc_pwym_task] [histbf] update_freeze_data: dabc9:bl_level=1740”
“app_log_cat new log begin”
“Line 627: 01-01 09:04:17.727 <6> [pid:14399, cpu1 dabc_pwym_task] [histbf] update_freeze_data: dabc:bl_level=1720”

比如,对于上面的日志,需要找到日志时间,并且要找到对应格式的数据。这里面包含的问题主要包括:

  1. 匹配工作。需要找到真正的日志,上面的第二行就不是真正的日志;
  2. 分割工作(split)。把日志按照空格进行分割,找到日志时间;
  3. 筛选工作。找到匹配的格式,从而把数字1740和1720筛选出来。

针对匹配工作,需要找到开头是 ‘Line‘ 的行。用到re的search()函数。

import re

strrs = list()
strrs.append("Line 622: 01-01 09:04:16.727 <6> [pid:14399, cpu1 dabc_pwym_task] [histbf]           update_freeze_data: dabc9:bl_level=1740")
strrs.append("app_log_cat new log begin")
strrs.append("Line 627: 01-01 09:04:17.727 <6> [pid:14399, cpu1 dabc_pwym_task] [histbf]           update_freeze_data: dabc:bl_level=1720")
regex = r‘Line‘
for strr in strrs:
    str_search = re.match(regex, strr)
    if str_search:
        print(True)
    else:
        print(False)

匹配结果如下

True
False
True

针对分割工作,需要找到日志时间。观察上述日志,是以空格作为分割依据。

import re

strr = ‘Line 622: 01-01 09:04:16.727 <6> [pid:14399, cpu1 dabc_pwym_task] [histbf]‘        ‘ update_freeze_data: dabc9:bl_level=1740‘
regex = ‘\s‘
str_split = re.split(regex, strr)
print(str_split)

分割后的输出是一个list,在其中选择时间对应的数据即可。

[‘Line‘, ‘622:‘, ‘01-01‘, ‘09:04:16.727‘, ‘<6>‘, ‘[pid:14399,‘, ‘cpu1‘, ‘dabc_pwym_task]‘, ‘[histbf]‘, ‘update_freeze_data:‘, ‘dabc9:bl_level=1740‘]

针对筛选工作,需要找到最后的数据。

import re

strr = """Line 622: 01-01 09:04:16.727 <6> [pid:14399, cpu1 dabc_pwym_task] [histbf]
          update_freeze_data: dabc9:bl_level=1740
          Line 627: 01-01 09:04:17.727 <6> [pid:14399, cpu1 dabc_pwym_task] [histbf]
          update_freeze_data: dabc:bl_level=1720"""
regex = r‘dabc\d?:bl_level=(\d+)‘
str_select = re.findall(regex, strr)
print(str_select)

筛选后的结果是一个list

[‘1740‘, ‘1720‘]
时间: 2024-10-11 05:24:39

Python日志分析与正则表达式的相关文章

python日志分析

微秒   毫秒 datetime seek定位指针 从行尾到行首 fd.seek(-2,1)  1  当前位置 fd.tell() fd.seek(-2,2)  2   最后位置 fd.tell() fd.seek(0,0)   0  最前位置 read(1)读一位    read() 全部都读 tac与cat    行首到行尾 reversed   翻转字符串 只读一部分    通过时间判断 200 404  503  十分钟之内   第八列  apache.log 1.首先匹配时间格式, D

python --日志分析

import datetime import re #def convert_time(timestr): # return datetime.datetime.strptime(timestr, "%d/%b/%Y:%H:%M:%S %z") #def convert_request(request:str): # return dict(zip(('method','url','protocol'),request.split())) def extract(line): #pat

Python第七课----正则和日志分析

一.正则表达式: 1.分类:     1.BRE基本正则,grep.sed,vi等软件支持,vim有扩展   2.ERE扩展正则,egrep.grep-E,sed-r等    3.PCRE最重要的,高级语言中的 2.基本语法:   1.元字符 metacharacter . 匹配除了换行符外任意一字符,迭代所有 . [abc] 字符"集合",只能从中拿出一个,然后一个个匹配一个位置 plain,匹配出a [^abc] 字符集合,表示一个字符位置,匹配非abc plain,匹配出plin

Python+MySQL实现web日志分析

(本文已不再同步更新,最新代码请见github)日志分析在web系统中故障排查.性能分析方面有着非常重要的作用.目前,开源的ELK系统是成熟且功能强大的选择.但是部署及学习成本亦然不低,这里我实现了一个方法上相对简单(但准确度和效率是有保证的)的实现.另外该脚本的侧重点不是通常的PV,UV等展示,而是短期内(如三天历史or一周历史)提供细粒度的异常和性能分析. 先说一下我想实现这个功能的驱动力(痛点)吧:我们有不少站点,前边有CDN,原站前面是F5,走到源站的访问总量日均PV约5000w.下面是

Python写WEB日志分析程序的一些思路

1.背景 刚到一家公司需要写一个实时分析tshark捕捉到的数据,tshark一直往文本里面写数据,写一个程序要实时获取到添加的数据并进行分析处理最后入库.此时思绪狂飞,想了一些比较挫的方法. 本人想到的方法: 1.每隔一定时间去查看下文件的mtime,如果有改动则读取数据,并记录读取的行数.下次再去读这个文件的数据则上次记录的行数开始继续读.当文件行数太大的时候这个程序的效率就很慢了,也可以记录上次读取的字节数,然后使用linux下的open系统系统中的seek从指定位置处读取.但是要是用C语

PYTHON上海分享活动小记---SQUID日志分析项目开发

上周末有幸跑到上海为小伙伴们分享了<SQUID日志分析项目>,主要是带大家用PYTHON迅速实现一个SQUID日志分析平台的前后端开发,一天的课程太紧张,导致有些细节不能完全实现,但整体思路啥的基本都OK啦,可惜的是由于电脑没配置好,导致没法录像....,要不然就可以放到网上与大家一起分享了,现在只能上几张图了... 最后感谢 波波同学,无偿负责组织策划了这次分享活动,感谢柏林,提供场地支持. 感谢大家花周末时间参加这个活动,希望此次分享对各位有所帮助.. PYTHON上海分享活动小记---S

python 经典语句日志分析

#!/usr/bin/python import re def buffer_line(): buf = open("/etc/sae/buffer_1").read() if not buf: return 0 else: return int(re.findall("^\d*", buf)[0]) def set_last_pos(pos): open("/etc/sae/buffer_1", "w").write(str

python简单日志分析

其实Python编程语言(http://www.maiziedu.com/course/python-px/)功能很强大,能对网站进行Apache日志分析,从运营的角度如果一个只做内容的网站只看访问量是不够的,还需要关注用户打开的那些网站地址最多,打开的地址越多表明这个文章就是热点文章,最开始的自动标热功能就是这么来的,所以一般公司都会有详细的后台统计系统,不过对我们一般人来说,如果只是自己搭建个小站,实在没必要去再开发个系统,当然用第三方的统计系统也能解决问题,关键就看你放不放心了,假如我要看

日志分析代码实现(正则表达式)

日志分析代码实现(正则表达式) 思路     使用正则表达式处理:         使用正则提取对应内容         每段数据转换为对应格式         精简代码,异常处理,代码效率检查 import datetime import re logline = '''183.60.212.153 - - [19/Feb/2013:10:23:29 +0800] \"GET /o2o/media.html?menu=3 HTTP/1.1" 200 16691 "-&quo