基于Python的Apache日志文件解析

2024-09-28 19:19:20 发布

您现在位置: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"

我尝试过这段代码,但是我得到的唯一输出是一长串闭括号[]

^{pr2}$

在本例中,我知道输出应该是3(因为只有三个日志的状态代码为200),但我似乎无法得到它。任何帮助都将不胜感激。在

谢谢:)


Tags: 代码httpmozillagetchromeaugsafarilike
3条回答

你在这里犯了以下错误。在

  1. Using match instead of search. See difference here
  2. Using {200} instead of {3}
  3. And not adding \s in the regex

所以你的正则表达式应该是

re.search(r'\s\d{3}\s', line)

所以你有以下代码:

^{pr2}$

输出:

(“找到”,3)

只需将regex更改为(200)\s。你要做的是匹配200个任意数字,然后匹配一个空格字符(比如空格或制表符的换行符)。你想要的是匹配令牌“200”。所以只要把(200)\s作为正则表达式。在

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]))

相关问题 更多 >