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

Nein

Nein

Referrer

"https://www.msxfaq.de/index.htm"

Nein

UserAgent

"Mozilla/5.0 (compatible; MSOffice 16)"

Nein

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