[英]Apache log file parsing via Python
我正在制作一個python日志解析器腳本,在該腳本中,我需要從日志文件計算狀態代碼為200的日志的數量。
以下是文件中的一些日志:
120.115.144.240 - - [29/Aug/2017:04:40:03 -0400] "GET /apng/assembler-2.0/assembler2.php HTTP/1.1" 404 231 "http://littlesvr.ca/apng/history.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36"
202.167.250.99 - - [29/Aug/2017:04:41:10 -0400] "GET /apng/images/o_sample.png?1424751982?1424776117 HTTP/1.1" 200 115656 "http://bbs.mydigit.cn/read.php?tid=2186780&fpage=3" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
14.152.69.236 - - [29/Aug/2017:04:41:41 -0400] "GET /apng/images/o_sample.png?1424751982?1424776117 HTTP/1.1" 304 - "http://bbs.mydigit.cn/read.php?tid=2205351" "Mozilla/5.0 (Linux; U; Android 7.1.2; zh-CN; NX510J Build/NJH47D) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.6.951 Mobile Safari/537.36"
60.4.236.27 - - [29/Aug/2017:04:42:46 -0400] "GET /apng/images/o_sample.png?1424751982?1424776117 HTTP/1.1" 200 115656 "http://bbs.mydigit.cn/read.php?tid=1952896" "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
58.62.17.190 - - [29/Aug/2017:04:50:01 -0400] "GET /apng/gif_apng_webp1.html HTTP/1.1" 200 935 "http://dev.qq.com/topic/582939577ef9c5b708556b0d" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
我已經試過了這段代碼,但是我得到的唯一輸出是一長串的括號[]
:
#!/usr/bin/env python3
import sys
import re
f = open('accesslogfile', 'r')
print('Reading log files... done.')
nooflines = f.readlines()
for line in nooflines:
regex = re.match(r'\d{200}\s', line)
print(regex)
f.close()
在這種情況下,我知道輸出應該為3
(因為只有三個日志的狀態碼為200),但是我似乎無法得到它。 任何幫助,將不勝感激。
謝謝 :)
只需將您的正則表達式更改為(200)\\s
。 您正在做的是匹配任意數字200,然后匹配一個空格字符(例如空格或制表符的換行符)。 您要匹配令牌“ 200”。 因此,只需將(200)\\s
作為您的正則表達式。
您在這里執行錯誤操作。
- 使用匹配而不是搜索。 在這里看到差異
- 使用{200}代替{3}
- 而不是在正則表達式中添加\\ s
所以你的正則表達式應該是
re.search(r'\s\d{3}\s', line)
因此,您具有以下代碼:
import re
counter = 0
for line in log.split('\n'):
if line:
regex = re.search(r'\s\d{3}\s', line)
if regex.group().strip() == '200':
counter += 1
print('Found ', counter)
輸出:
('找到',3)
import pandas
df = pandas.read_csv("log_path", sep='\s+', names=[i for i in range(10)])
print(df.loc[df[6] == 200])
print(len(df.loc[df[6] == 200]))
很簡單:
re.findall('(HTTP/1.1\" 200)',line)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.