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.
1 2 3 4 5 6 |
## $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) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
######################################################################################################### ## ## 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