Как написать парсинг apache access.log с результатом в JSON файле?
Мне необходимо написать код для парсинга acccess.log и скомпилировать результаты в результирующем JSON файле. Данный файл должен содержать следующий вывод:
- 10 самых часто встречающихся запросов
- Помимо IP отображаются метод, URL, статус-код, длительность запроса
Пока я только в начале своего пути и написал следующий код:
import argparse
import json
import re
from collections import Counter
parser = argparse.ArgumentParser(description='Код для анализа логов')
parser.add_argument('-f', dest='logfile', action='store', default='access.log')
args = parser.parse_args()
regul_ip = (r"^(?P<ips>.*?)")
def address_top10():
with open(args.logfile) as file:
for index, line in enumerate(file.readlines()):
try:
ips = re.search(regul_ip, line).group()
return Counter(ips).most_common(10)
except AttributeError:
pass
print(json.dumps(address_top10(), indent=4))
with open("final_log.json", "w") as jsonfile:
json.dump(address_top10(), jsonfile, indent=4)
После выполнения кода вот какой вывод: ""
Что-то, видимо, забыл, только не пойму - что.
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Модуль Pandas идеально подходит для обработки, анализа и визуализации табличных данных.
Пример:
import pandas as pd
url_or_file = "https://raw.githubusercontent.com/elastic/examples/master/Common%20Data%20Formats/apache_logs/apache_logs"
cols = ['ip','l','userid','timestamp','tz','request','status','bytes','referer','useragent']
df = pd.read_csv(url_or_file, delim_whitespace=True, names=cols).drop('l', 1)
df["timestamp"] = df["timestamp"].str.lstrip("[") + " " + df.pop("tz").str.rstrip("]")
получили Pandas DataFrame:
In [20]: df
Out[20]:
ip userid timestamp request status bytes referer useragent
0 83.149.9.216 - 17/May/2015:10:05:03 ... GET /presentations/lo... 200 203023 http://semicomplete.c... Mozilla/5.0 (Macintos...
1 83.149.9.216 - 17/May/2015:10:05:43 ... GET /presentations/lo... 200 171717 http://semicomplete.c... Mozilla/5.0 (Macintos...
2 83.149.9.216 - 17/May/2015:10:05:47 ... GET /presentations/lo... 200 26185 http://semicomplete.c... Mozilla/5.0 (Macintos...
3 83.149.9.216 - 17/May/2015:10:05:12 ... GET /presentations/lo... 200 7697 http://semicomplete.c... Mozilla/5.0 (Macintos...
4 83.149.9.216 - 17/May/2015:10:05:07 ... GET /presentations/lo... 200 2892 http://semicomplete.c... Mozilla/5.0 (Macintos...
... ... ... ... ... ... ... ... ...
9994 63.140.98.80 - 20/May/2015:21:05:28 ... GET /blog/tags/puppet... 200 14872 http://www.semicomple... Tiny Tiny RSS/1.11 (h...
9995 63.140.98.80 - 20/May/2015:21:05:50 ... GET /blog/geekery/sol... 200 10756 - Tiny Tiny RSS/1.11 (h...
9996 66.249.73.135 - 20/May/2015:21:05:00 ... GET /?flav=atom HTTP/1.1 200 32352 - Mozilla/5.0 (compatib...
9997 180.76.6.56 - 20/May/2015:21:05:56 ... GET /robots.txt HTTP/1.1 200 - - Mozilla/5.0 (Windows ...
9998 46.105.14.53 - 20/May/2015:21:05:15 ... GET /blog/tags/puppet... 200 14872 - UniversalFeedParser/4...
[9999 rows x 8 columns]
теперь можно анализировать его как угодно, например показать 10 самых часто встречающихся запросов:
In [22]: df["request"].value_counts().iloc[:10]
Out[22]:
GET /favicon.ico HTTP/1.1 747
GET /style2.css HTTP/1.1 531
GET /reset.css HTTP/1.1 524
GET /images/jordan-80.png HTTP/1.1 521
GET /images/web/2009/banner.png HTTP/1.1 504
GET /blog/tags/puppet?flav=rss20 HTTP/1.1 488
GET /?flav=rss20 HTTP/1.1 217
GET /projects/xdotool/ HTTP/1.1 208
GET /robots.txt HTTP/1.1 156
GET / HTTP/1.1 151
Name: request, dtype: int64