1. 程式人生 > >Python日誌分析與正則表達式

Python日誌分析與正則表達式

logs sea 篩選 ear d+ class 時間 針對 日誌

程序員經常會面臨日誌的分析工作。而正則表達式是處理日誌的必備工具。

“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 = rLine 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 = rdabc\d?:bl_level=(\d+)
str_select = re.findall(regex, strr)
print(str_select)

篩選後的結果是一個list

[1740, 1720]

Python日誌分析與正則表達式