PowerShell: Simpler Log-Parser

Anwendungen die keine sauberen Einträge in der Windows-Ereignisanzeige pflegen, bedienen sich oft eigener Log-Dateien die irgendwo im Dateisystem abgelegt sind. Eine tägliche Analyse dieser Protokolle ist mühsam. Um den Überblick zu behalten, hilft als Beispiel ein kleines PowerShell-Skript welches über die Aufgabenplanung ausgeführt, regelmäßig die Protokolle oder Logdateien auf einen bestimmten String durchsucht.

Das maximale Alter der Protokolldateien kann über den Skript-Parameter -PeriodToParse definiert werden (Muss als Negativwert angeben werden). Der zu suchende String selbst, kann mittels Skript-Parameter -StringToFind angegeben werden. Die zu durchsuchenden Protokolle können nach Wahl ebenfalls über einen Parameter -FilesToParse (Array) oder direkt im Skript angegeben werden (Aktuell auskommentiert). So besteht die Möglichkeit über mehrere geplante Aufgaben – nach unterschiedlichen Strings in differenzierten Protokollen suchen zu lassen.

Die Variable $ParserStatus kann bspw. in ein eigenes Protokoll umgeleitet werden. Alternativ können die Zeilen auch einfach entfernt werden.

Die Konfiguration der Mailserver-Informationen habe ich bewusst im Skript belassen, da es durch die vielen Parameter bereits unübersichtlich genug ist.

#Variablen ueber Parameter setzen
Param ([String] $StringToFind,[Int] $PeriodToParse,[Array] $FilesToParse)

#Mailinformationen
$PSMailDomain = "Mail-Domain"
$PSEmailServer = "SMTP-Server"
$PSEmailRecipient = "Empfaenger"

#Alternativ koennen die Logdateien auch direkt gepflegt werden.
#$FilesToParse = @(
#'\\Server1\c$\protokoll.log',
#'\\Server2\c$\ereignis.txt'
#)

ForEach ($FilePath in $FilesToParse) {

 if (Test-Path $FilePath -NewerThan (Get-Date).AddDays($PeriodToParse)) {
  if (Select-String -Path $FilePath -Pattern $StringToFind -SimpleMatch -Quiet) {
 
   $ParserStatus = "$StringToFind in $FilePath gefunden!"
   $FileContent = Get-Content $FilePath
    
   Send-MailMessage -to "$PSEmailRecipient" -from "$env:computername@$PSMailDomain" -Subject "LOG-PARSER | Fehler in $FilePath gefunden!" -Body "$ParserStatus bitte analysieren...<br /><br /><a href='$FilePath'>Protokoll-Link bitte klicken</a><br /><br />Protokollinhalt:<br /><br /><table border='1'><tr><td>$FileContent</td></tr></table>" -BodyAsHtml

  } else {
   $ParserStatus = "Der String $StringToFind wurde nicht in $FilePath gefunden."
  }

 } else {
  $ParserStatus = "Die Datei bzw. der angegebene Pfad $FilePath existiert nicht, oder die Datei ist zu alt!"
 }

}

Eine manuelle Ausführung des Skripts sehe dann wie folgt aus:

C:\Script\PSParser.ps1 -StringToFind „Error“ -PeriodToParse „-7“ -FilesToParse „\\Server1\c$\Temp\protocol.txt“

EDIT: Ich habe das Skript so erweitert, dass der Inhalt des entsprechenden Logs bzw. Protokoll als Nachrichten-Inhalt versendet wird. Je nachdem wie groß so ein Log wird, sollte die Funktion ggf. wieder entfernt werden. Alternativ ist noch der direkte Link zur entsprechenden Datei enthalten.

Viel Spaß mit dem Skript.

Leon Gawinski

Leon Gawinski

System Engineer Softwarebereich Microsoft

Empfohlene Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Schaltfläche "Zurück zum Anfang"