2016-11-11 6 views
0

Ich habe einen benutzerdefinierten Zugriffs LOG für Apache:Apache Zugriffsprotokoll Regex Parsen

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{JSESSIONID}C %D %V" mylog 

ich von Python zu analysieren versuche die LOGs erzeugt; aber ich habe zwei Probleme:

  • Anforderungen ohne Request-Methode (HTTP/1.0 oder HTTP/1.1) werden nicht korrekt analysiert.
  • Anforderung mit Leerzeichen im angeforderten Pfad werden nicht korrekt analysiert (Ich weiß nicht, ob Apache diesen Pfad verschlüsselt speichert oder die Leerzeichen speichert, aber ich könnte eine LOG-Zeile generieren, die eine Anforderung per Hand in Telnet erstellt).

Mit dieser regex:

(?P<ip>.*) (?P<remote_log_name>.*) (?P<userid>.*) \[(?P<date>.*)(?=) (?P<timezone>.*?)\] \"(?P<request_method>.*) (?P<path>.*)(?P<request_version> HTTP/.*)\" (?P<status>.*) (?P<length>.*) \"(?P<referrer>.*)\" \"(?P<user_agent>.*)\" (?P<session_id>.*) (?P<generation_time_micro>.*) (?P<virtual_host>.*) 

Die Parsing nicht mit den ersten drei Zeilen dieses LOG:

1.1.1.2 - - [11/Nov/2016:03:04:55 +0100] "GET /" 200 83 "-" "-" - 9221 1.1.1.1 
127.0.0.1 - - [11/Nov/2016:14:24:21 +0100] "GET /uno dos" 404 298 "-" "-" - 400233 1.1.1.1 
127.0.0.1 - - [11/Nov/2016:14:23:37 +0100] "GET /uno dos HTTP/1.0" 404 298 "-" "-" - 385111 1.1.1.1 
1.1.1.1 - - [11/Nov/2016:00:00:11 +0100] "GET /icc HTTP/1.1" 302 - "-" "XXX XXX XXX" - 6160 11.1.1.1 
1.1.1.1 - - [11/Nov/2016:00:00:11 +0100] "GET /icc/ HTTP/1.1" 302 - "-" "XXX XXX XXX" - 2981 1.1.1.1 

Regex simuliert https://regex101.com/r/xDfSqj/2 hier.

+0

Können Sie mir helfen zu verstehen, warum ein Lookahead '' '(? =)' '' Nach dem Datum verwendet wird? Dies zu entfernen, scheint das Ergebnis im Regex-Simulator nicht zu ändern, und gemäß den Apache-Dokumenten ist dieser Raum immer vorhanden. – liquidki

Antwort

2

diese Lösung Versuchen: https://regex101.com/r/xDfSqj/4

Es ist die gleiche Sache, die Sie hatten, außer:

(?P<ip>.*?) (?P<remote_log_name>.*?) (?P<userid>.*?) \[(?P<date>.*?)(?=) (?P<timezone>.*?)\] \"(?P<request_method>.*?) (?P<path>.*?)(?P<request_version> HTTP/.*)?\" (?P<status>.*?) (?P<length>.*?) \"(?P<referrer>.*?)\" \"(?P<user_agent>.*?)\" (?P<session_id>.*?) (?P<generation_time_micro>.*?) (?P<virtual_host>.*) 

Eine Capture-Gruppe um HTTP hinzugefügt wurde/1.0 und die gegeben? Quantor. Dies wird auch Ihren anderen Gruppen hinzugefügt, um gieriges Capturen zu verhindern.

Haben Sie versucht, dies zu erreichen?

Verwandte Themen