Hallo zusammen,
in dem heutigen Howto zeige ich euch ein kleines Powershell Skript, wie Ihr Logdateien in Realtime monitoren könnt.
Folgenden Zeilen im Skript sollten angepasst werden, über diese Variablen könnt Ihr das Monitoring steuern.
Im Header des Skripts habe ich den Ablauf dokumentiert, sollten noch Fragen aufkommen, Ihr wisst wie Ihr mich erreichen könnt.
## $EmailPasswortFile = "D:\PowershellScripte\MailPasswort.txt" $LogFiletoCheck = "D:\PowershellScripte\MyLogFiles.txt" $ScriptSleepTimeOut = 10 ## 10 Sekunden Pause in der Skript Schleife $ScriptLoopTime = 5 ## 5 Minuten Skriptlaufzeit $EventCheckCount = 15 ## Überprüft das Dienstprotokoll nach der Anzahl der Ereignisse, hier Maximal 15 Einträge $EventTimeRange = 30 ## Zeitspanne für die Anzahl der Ereignisse, wenn mehr als 15 Einträge in 30 Minuten geschrieben werden, mach irgendwas (z.B. E-Mail versenden)
######################################################################################################### ## ## Name: Log Datei überwachung, Ergebnisse ins Dienstprotokoll schreiben ## Ersteller: Helmut Thurnhofer ## Erstellungsdatum: 05.01.2016 ## Version: 1.0 ## ####################################################### ## Skriptbeschreibung und Vorbereitung auf dem Server: ####################################################### ## ## Um mit dem Skript arbeiten zu können müssen ein paar Vorbereitungen auf dem Server getroffen werden. ## Zum einem muss die ExecutionPolicy für den auszuführenden Benutzer gesetzt werden und zum zweiten wird in der Ereignisanzeige ## ein neues Dienstprotokoll angelegt. (Zu finden unter Anwendungs- und Dienstprotokoll) ## ## Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force ## (Die Powershell wird keine Skripte ausführen, die aus dem Internet stammen – Für unsere Aufgabe beste Wahl.) ## ## Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force ## (Die Powershell ignoriert die digitale Signatur, fragt aber nach, ob ein Skript, das aus dem Internet stammt, ausgeführt werden soll.) ## ################################################### ## Dienstprotokoll anlegen mit folgenden Befehlen: ################################################### ## ## New-EventLog -LogName MeinServerLog -Source Error,Fatal,Warning,Information ## Limit-EventLog -LogName MeinServerLog -MaximumSize 10485760 -OverflowAction OverwriteAsNeeded ## ## -MaximumSize 524288 = 512KB ## -MaximumSize 1048576 = 1024KB = 1MB ## -MaximumSize 10485760 = 10240KB = 10MB ## -MaximumSize 20971520 = 20480KB = 20MB ## ################################################################ ## Testeinträge in das neu erstellte Dienstprotokoll schreiben: ################################################################ ## ## Write-EventLog -LogName MeinServerLog -Source Information -EntryType Information -EventId 1000 -Message "Information über die PowerShell" ## Write-EventLog -LogName MeinServerLog -Source Warning -EntryType Warning -EventId 2000 -Message "Warning über die PowerShell" ## Write-EventLog -LogName MeinServerLog -Source Error -EntryType Error -EventId 3000 -Message "Error über die PowerShell" ## Write-EventLog -LogName MeinServerLog -Source Fatal -EntryType Error -EventId 4000 -Message "Fatal über die PowerShell" ## ## Für die Events wurde eigene EventIDs verwendet, Information=1000, Warnungen=2000, Error=3000, Fatal=4000 ## ############################################# ## Testeinträge im Dienstprotokoll abfragen: ############################################# ## ## Get-EventLog -LogName MeinServerLog -InstanceId 3000,4000 -Newest 20 ## ## $DateNow = Get-Date ## $Time30Minutes = (Get-Date).AddMinutes(-30) ## Get-EventLog -LogName MeinServerLog -EntryType Error -Before $DateNow -After $Time30Minutes ## ## Get-EventLog -LogName MeinServerLog -Source Fatal,Error ## Get-EventLog -List ## ############################################################################################################## ## Um das ganze Simulieren zu können, wurde eine leere Log Datei erstellt und mit folgenden Einträgen gefüllt. ## Die Einträge wurden Zeitversetzt über eine zweite Powershell Sitzung ausgeführt. ############################################################################################################## ## ## $Date = Get-Date ## $DateTime = $Date.ToString("yyyy-MM-dd HH:mm:ss") ## Add-Content "D:\PowershellScripte\MyLogFiles.txt" -Value "$DateTime - FATAL: 0x80070490: EvaluateApplicability failed in CCbs::EvaluateApplicability" ## ## $Date = Get-Date ## $DateTime = $Date.ToString("yyyy-MM-dd HH:mm:ss") ## Add-Content "D:\PowershellScripte\MyLogFiles.txt" -Value "$DateTime - ERROR: 0x80070432: Forced install timer expired for AUInstallType = 4" ## ## $Date = Get-Date ## $DateTime = $Date.ToString("yyyy-MM-dd HH:mm:ss") ## Add-Content "D:\PowershellScripte\MyLogFiles.txt" -Value "$DateTime - Information: 0x80000000: Successfully wrote event for AU health state:0" ## ## $Date = Get-Date ## $DateTime = $Date.ToString("yyyy-MM-dd HH:mm:ss") ## Add-Content "D:\PowershellScripte\MyLogFiles.txt" -Value "$DateTime - Warning: 0x80202000: Warning event for AU health state were 3" ## ###################################################################### ## Bitte diese Zeilen vor dem ersten Lauf im Skript ausführen, ## Hier wird das E-Mail Benutzer Passwort als String in einen Textdatei geschrieben. ## Diese Textdatei wird für den späteren E-Mail versandt benötigt. ###################################################################### ## ## (Get-Credential).Password | ConvertFrom-SecureString > $EmailPasswortFile ## ######################################################################################################### Clear-Host ## Basisparameter für das Skript ## ## $EmailPasswortFile = "D:\PowershellScripte\MailPasswort.txt" $LogFiletoCheck = "D:\PowershellScripte\MyLogFiles.txt" $ScriptSleepTimeOut = 10 ## 10 Sekunden Pause in der Skript Schleife $ScriptLoopTime = 5 ## 5 Minuten Skriptlaufzeit $EventCheckCount = 15 ## Überprüft das Dienstprotokoll nach der Anzahl der Ereignisse, hier Maximal 15 Einträge $EventTimeRange = 30 ## Zeitspanne für die Anzahl der Ereignisse, wenn mehr als 15 Einträge in 30 Minuten geschrieben werden, mach irgendwas (E-Mail versenden) ## ######################################################################################################### ## Basis E-Mail Server Konfiguration ## ## $ServerName = "$env:COMPUTERNAME.$env:USERDOMAIN" ## $KundenName = "Musterkunde Deutschland GmbH" ## $SMTPServer = "smtp.domain.de" ## $SMTPUserName = "Benutzername" ## Bitte diese Skriptzeile vorab ausführen damit die EmailPasswort datei erstellt wird. ## ## (Get-Credential).Password | ConvertFrom-SecureString > $EmailPasswortFile ## $SMTPUserPwd = Get-Content -Path $MailPasswortFile | ConvertTo-SecureString ## $Cred = New-Object System.Management.Automation.PSCredential $SMTPUserName, $SMTPUserPwd ## ## Basisinformationen für den E-Mail versandt. ## ## $EmailTo = empfaenger@domain.de ## $EmailFrom = absender@domain.de ## $EmailSubject = "Es wurde beim `"$KundenName`" mehr als 15 Fatal/Error Einträge in den Logs gefunden. Bitte Server: `"$ServerName`" überprüfen!" ## $EmailBody ist weiter unten im Skript definiert, da hier die Auswertung der Variaben benötigt werden. ######################################################################################################### $LoopStartTime = Get-Date $LoopStartTimeFormatted = $LoopStartTime.ToString("dd.MM.yyyy HH:mm:ss") $LoopEndTime = $LoopStartTime.AddMinutes($ScriptLoopTime) $LoopEndTimeFormatted = $LoopEndTime.ToString("dd.MM.yyyy HH:mm:ss") ## $LoopEndTime = $LoopStartTime.AddHours($ScriptLoopTime) ## $LoopEndTimeFormated = $LoopEndTime.ToString("dd.MM.yyyy HH:mm:ss") Write-Host "`nRealtime LogFile Monitoring wurde gestartet um: $LoopStartTimeFormatted" -ForegroundColor Gray write-host "Realtime LogFile Monitoring wird beendet um: $LoopEndTimeFormatted`n" -ForegroundColor Gray ######################################################################################################### ## Alle 10 Sekunden wird die Schleife wiederholt, bei einem Treffer im Log wird ein Ereigniseintrag geschrieben ## Wenn mehr als 15 Einträge in 30 Minuten geschrieben werden, wird eine E-Mail Versand. ## Skript Idee -- http://sion-it.co.uk/tech/powershell/loop-until-a-certain-time Do { ## Hier wird pro Schleifendurchlauf die Aktuelle Zeit geholt und neu gesetzt ## $LoopTimeNow = Get-Date $LoopTimeNowFormatted = $LoopTimeNow.ToString("dd.MM.yyyy HH:mm:ss") ## Diese Zeitangabe wird für die Suche in der Log Datei benötigt, wenn hier Einträge älter/gleich Suchzeit ist. ## Wird ein neuer Dienstprotokoll Eintrag geschrieben, diese Zeit sollte mit der Skriptpause übereinstimmen, ## ansonsten werden hier wo wöglich neue Einträge in der Log nicht gefunden, das Sie aus der Zeitrange fallen. ## $SearchTime = (Get-Date).AddSeconds(-$ScriptSleepTimeOut) $SearchTimeInLog = $SearchTime.ToString("yyyy-MM-dd HH:mm:ss") If ($LoopTimeNow -ge $LoopEndTime) { Write-host "Endzeit: `"$LoopEndTimeFormatted`" ist erreicht, Skript wird im nächsten Durchgang beenden." } Else { ## Überprüft die Einträge in der Log Datei, sollte was gefunden werden, wird es an die ForEach Schleife übergeben und in das Dienstprotokoll geschrieben. ## [string[]]$FatalMessages = Get-Content $LogFiletoCheck | Where-Object {($_ -ge $SearchTimeInLog) -and $_ -match "FATAL"} [string[]]$ErrorMessages = Get-Content $LogFiletoCheck | Where-Object {($_ -ge $SearchTimeInLog) -and $_ -match "ERROR"} [string[]]$WarningMessages = Get-Content $LogFiletoCheck | Where-Object {($_ -ge $SearchTimeInLog) -and $_ -match "Warning"} ForEach ($FatalMessage in $FatalMessages) { Write-EventLog -LogName enaioServerLog -Source Fatal -EntryType Error -EventId 4000 -Message "$FatalMessage" Write-Host "Ereigniseintrag `"$FatalMessage`" wurde erstellt." -ForegroundColor DarkRed } ForEach ($ErrorMessage in $ErrorMessages) { Write-EventLog -LogName enaioServerLog -Source Error -EntryType Error -EventId 3000 -Message "$ErrorMessage" Write-Host "Ereigniseintrag `"$ErrorMessage`" wurde erstellt." -ForegroundColor DarkRed } ForEach ($WarningMessage in $WarningMessages) { Write-EventLog -LogName enaioServerLog -Source Warning -EntryType Warning -EventId 2000 -Message "$WarningMessage" Write-Host "Ereigniseintrag `"$WarningMessage`" wurde erstellt." -ForegroundColor DarkYellow } ## Überprüfe das Dienstprotokoll, wenn mehr als 15 Einträge in 30 Minuten geschrieben wurden, wird eine E-Mail an den Administrator versendet. ## $Count = $EventCheckCount $DateNow = Get-Date $Time30Minutes = (Get-Date).AddMinutes(-$EventTimeRange) $EventDate = $Time30Minutes.ToString("yyyy-MM-dd HH:mm:ss") $EventCount = (Get-EventLog -LogName enaioServerLog -InstanceId 3000,4000 -Before $DateNow -After $Time30Minutes).Count ## $EmailBody = "In den letzten 30 Minuten sind mehr als $Count (Gesamt: $EventCount) Fatal oder Error Ereigniseinträge geschrieben worden." If($EventCount -ge $Count) { Write-Host "`nIn den letzten 30 Minuten sind mehr als $Count (Gesamt: $EventCount) Fatal oder Error Ereigniseinträge geschrieben worden." -ForegroundColor DarkRed Write-Host "E-Mail wird versendet, da mehr als $Count (Gesamt: $EventCount) Fatal oder Error Ereigniseinträge geschrieben worden sind." -ForegroundColor DarkRed ## Aktion einfügen wie z.B. Mail versandt ## ## Send-MailMessage -Credential $Cred -SmtpServer $SMTPServer -To $EmailTo -From $EmailFrom -Subject $EmailSubject -Body $EmailBody -Encoding ([System.Text.Encoding]::UTF8) } Else { Write-Host "`nIn den letzten 30 Minuten sind weniger als $Count (Gesamt: $EventCount) Fatal oder Error Ereigniseinträge geschrieben worden." -ForegroundColor DarkGreen Write-Host "E-Mail wird nicht versendet, da weniger als $Count (Gesamt: $EventCount) Fatal oder Error Ereigniseinträge geschrieben worden sind." -ForegroundColor DarkGreen } ## Statusmeldung, wie lange das Skript noch ausgeführt wird ## Write-Host "Skript wird noch nicht beendet, es läuft noch bis `"$LoopEndTimeFormatted`"" -ForegroundColor Gray } ## Skriptpause bis die Schleife wiederholt wird ## Start-Sleep -Seconds $ScriptSleepTimeOut } ## Skript wird nach Erreichen der Angegeben Zeit beendet ## Until ($LoopTimeNow -ge $LoopEndTime)
Wie immer freue ich mich über Kommentare und Anregungen.
Viele Grüße
Helmut