Code: Select all
import pandas as pd
import pytz
from datetime import datetime
import re
def parse_str(x):
if x is None:
return '-'
else:
return x[1:-1]
def parse_datetime(x):
try:
dt = datetime.strptime(x[1:-7], '%d/%b/%Y:%H:%M:%S')
dt_tz = int(x[-6:-3])*60+int(x[-3:-1])
return dt.replace(tzinfo=pytz.FixedOffset(dt_tz))
except ValueError:
return datetime.now()
def parse_int(x):
return int(x) if x is not None else 0
data = pd.read_csv(
'Log_jeden_den.log',
sep=r'\s(?=(?:[^"]*"[^"]/")*[^"]*$)(?![^\\[]*\\])',
engine='python',
na_values='-',
header=None,
usecols=['ip', 'request', 'status', 'size', 'referer', 'user_agent'],
names=['ip', 'time', 'request', 'status', 'size', 'referer', 'user_agent'],
converters={'time': parse_datetime,
'request': parse_str,
'status': parse_int,
'size': parse_int,
'referer': parse_str,
'user_agent': parse_str})
print(data.head())
Grundsätzlich muss ich jede Teil des Log -Log -Log -Log -Log -Log -Log -Datei aufgeteilt. />
193.87.12.30 - - [19/FEB/2020: 06: 50 +0100] 200 7584 "-" "-"
193.87.12.30 - - [19/Feb/2020:06:25:55 +0100] "GET /navbar/navbar-ukf.html HTTP/1.0" 200 7584 "-" "-"
193.87.12.30 - - [19/FEB/2020: 06: 25: 56 +0100] "Get/Navbar/Navbar-UKF.html http/1.0" 200 7584 "-" "-"
193.87.12.30-[19/Februar/2020: 06: 57: 57 +0100 "" Gent Gent/Feb/2020: 06: 57 +0100 "" Gent /navbar/navbar-ukf.html http/1.0 "200 7584"-""-"
193.87.12.30--[19/FEB/2020: 06: 25: 49 +0100]" Get/http/1.1 "200 20925"-"-" "libwww-perl/6.08"
23.100.232.233 - - [19/Feb/2020:06:25:49 +0100] "GET /media-a-marketing/dianie-na-univerzite/kalendar-udalosti/815-den-otvorenych-dveri-2018 HTTP/1.1" 200 26802 "-" "Mozilla/5.0 (kompatibel; MSIE 9.0; Windows NT 6.0; Trident/5.0; Trident/5.0) "
193.87.12.30 - - [19/FEB/2020: 06: 25: 46 +0100]" Get/http/1,1 "200 20925" - "
Code: Select all
usecols=[0, 3, 4, 5, 6, 7, 8]
, um zu summieren. Ich muss die Protokolldaten auf Spalten aufbrechen. Mein Code macht das etwas, aber falsch. Es schafft die Spalten, teilt aber nicht die Daten zwischen ihnen auf, sondern bringt sie alle in die erste Spalte. Das Benennen der Spalten half nicht und markierte sie mit Zahlen ParserError. Ist es jedoch möglich? Vielen Dank für alle Ratschläge im Voraus.