Parse-ApacheLogs
Exchange, Skype, SharePoint und Co nutzen den IIS mit seinem Logfile. Aber mein Webhoster nutzt nun mal Apache und der hat ein anderes Log. Mit diesem PowerShell-Modul kann ich einfach die generelle Apache Logs aber auch die 1und1-Besonderheiten auseinander nehmen und weiter verarbeiten
Eingangsdaten
Apache kennt zum Logging von Webserver-Zugriffen zwei gebräuchliche Formate.
- Common
Das einfache verkürzte Format - Combined
Etwas länger und enthält u.a. auch den Referer und UserAgent
Allerdings haben ich gesehen, dass mein Webhoster "1und1"aber die Logs noch etwas anders schreibt. Nach einer Analyse habe ich folgende Beispiele ausgewertet. (Zur Lesbarkeit umgebrochen)
78.47.201.0 - - [31/Dec/2018:00:00:04 +0100] "GET /newsletter/msxfaq.xml HTTP/1.1" 301 251 www.msxfaq.de "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 10.0; MSOffice 16)" "-"
Hier noch mal der Überblick.
Feldname | Beispel | Common | Combined | 1und1 |
---|---|---|---|---|
Host |
80.22.18.24 |
|
|
|
Logname |
- |
|
|
|
User |
- |
|
|
|
TimeString |
[31/Dec/2018:00:00:04 +0100] |
|
|
|
Request |
"GET /newsletter/msxfaq.xml HTTP/1.1" |
|
|
|
Status |
200 |
|
|
|
BytesSent |
2561 |
|
|
|
Hostname |
www.msxfaq.de |
|
|
|
Referrer |
"https://www.msxfaq.de/index.htm" |
|
|
|
UserAgent |
"Mozilla/5.0 (compatible; MSOffice 16)" |
|
|
|
Unbekannt |
- |
|
|
|
Das weicht schon etwas von einem IISLog ab, aber kann einfache eingelesen werden. Das Trennzeichen der Spalten ist ein "Leerzeichen" und wenn in einem Feld selbst Leerzeichen vorkommen, dann werden diese in doppelten Anführungszeichen eingebunden.
Verarbeitung
Ich habe mich dazu entschieden, die Daten einfach über die Pipeline anzunehmen und wieder auszugeben. Nach klassischer PowerShell-Philosophie kann ich dann die Dateien individuelle auswählen, mit "Get-Content" zusenden und hinten raus dann mit Group, Export-CSV o.ä. wieder weiter verarbeiten.
Hier das, zugegeben, sehr einfache Skript
parse-apachelog.20190408.ps1.txt
Auswertungen
Wenn ich die Ausgaben aber nun wieder als PowerShell-Objekte habe, dann ist eine Auswertung sehr einfach möglich
# Liste der externen Referer auf "nicht HTML-Seiten" ausgeben. # Zeit meist gut an, wenn andere Seiten z.B. Bilder direkt verlinken # Das liefert mir Hinweise auf kopierte Seiten get-content 'C:\\Meine Websites\logs.1und1\access.log.01' ` | .\parse-apachelog.ps1 ` | where {(!$_.request.contains(".htm") -and (!$_.referer.contains("www.msxfaq.de")) )} ` |select request,referer `
Weitere Auswertungen sind natürlich auch noch möglich. Selbst ein Export in eine CSV-Datei oder SQL-Datenbank zur Weiterverarbeitung mit Power Bi ist so einfach möglich.
Weitere Links
- Apache als Reverse Proxy
- Squid, Apache und andere Proxy Server mit OWA
- sunnyone/ApacheLogParser.psm1
https://gist.GitHub.com/sunnyone/4291248
Da habe ich mir einen RegEx-Ausdruck abgeschaut. - 1und1 Hinweise zu Log-Dateien
https://www.ionos.de/hilfe/hosting/log-dateien/hinweise-zu-log-dateien/
Leider ohne einen Hinweis, dass in der Mitte noch der Hostname addiert wurde. Die 1und1-Logs sind angepasste Apache Logs - Apache LogFiles Log Files
http://httpd.apache.org/docs/current/logs.html - Log-Dateien des Webservers herunterladen
https://www.ionos.de/hilfe/hosting/log-dateien/log-dateien-des-webservers-herunterladen/ - Welche Informationen ein Logfile
enthalten kann
https://www.ionos.de/digitalguide/online-marketing/web-analyse/logfiles-die-protokolle-der-computerprozesse/