簡體   English   中英

通過Python解析Apache日志文件

[英]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作為您的正則表達式。

您在這里執行錯誤操作。

  1. 使用匹配而不是搜索。 在這里看到差異
  2. 使用{200}代替{3}
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM