Zum Inhalt wechseln


Foto

Error.log durchsuchen und "Flag" setzen?


  • Bitte melde dich an um zu Antworten
9 Antworten in diesem Thema

#1 Sebialt

Sebialt

    Newbie

  • 9 Beiträge

 

Geschrieben 02. Mai 2017 - 09:09

Ich habe ein kleines Problem und vielleicht kann mir ja jemand helfen.

Ich durchsuche mittels Powershell eine LOG-Datei und beim Finden von einem bestimmten Pattern versendet das Script eine E-Mail.

IF (Select-String -path "Pfad\Error.log" -Pattern  "Error1") 
{ 
Send-MailMessage -to "Adresse1@Domain.de" -from "Adresse2@Domain.de" -Subject "Fehler gedunden." -body "Fehler bla bla bla..." -Encoding ([System.Text.Encoding]::UTF8)   
}

Das Script wird über die Aufgabenplanung alle paar Minuten aufgerufen.

Nun kann es natürlich vorkommen, dass ein Fehler auftritt (im Log steht das Pattern) und eine E-Mail versendet wird.
Behebe ich nun diesen Fehler, steht im Error.log (es wird jeden Tag neu erzeugt) immer noch der Fehler "Error1" und es wird beim nächsten Durchlaufen des Scrips eine E-Mail versendet.

Das möchte ich gerne verhindern.

Mein Ansatz wäre, die Anzahl der "Error1" Einträge zu zählen und die Anzahl in eine Datei zu schreiben. Das Script könnte dann vergleichen ob die Anzahl steigt -> dann E-Mail versenden oder gleich ist -> dann keine E-Mail versenden.

 

Wie könnte ich das in Powershell umsetzen?
Oder hat vielleicht jemand eine andere Idee, wie ich meine Vorhaben umsetzen kann?



#2 BOfH_666

BOfH_666

    Junior Member

  • 146 Beiträge

 

Geschrieben 02. Mai 2017 - 10:57

Wenn es sowieso neu erzeugt wird, kann man es nicht einfach löschen / leeren, nachdem es "bearbeitet" / "gescannt" wurde?


live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''

#3 MurdocX

MurdocX

    Board Veteran

  • 585 Beiträge

 

Geschrieben 02. Mai 2017 - 11:21

Falls das Skript nicht beendet wird, könntest du über eine Schleifen-Variable den Stand speichern und wieder abrufen. Andernfalls Olaf seinen Vorschlag eher in betracht ziehen.


Mit freundlicher Unterstützung
Jan


#4 Sebialt

Sebialt

    Newbie

  • 9 Beiträge

 

Geschrieben 02. Mai 2017 - 11:37

Das Error.log wird um 0:00 Uhr automatisch umbenannt und gespeichert (Datum_Error.log) und eine neues (Error.log) wird generierte.

 

... kann man es nicht einfach löschen ...

Löschen kann ich es nicht einfach, da die alten Logs 30 Tage aufgehoben werden müssen.

 

Falls das Skript nicht beendet wird ...

Das Script wird nach jedem Lauf beendet, sodass der Wert in einer Variablen verloren gehen würde.



#5 BOfH_666

BOfH_666

    Junior Member

  • 146 Beiträge

 

Geschrieben 02. Mai 2017 - 12:58

Hmmm ... Du bräuchtest dann wohl doch eine "Zählvariable". Die Kannst Du dann (pro Tag) auswerten und entsprechend reagieren. Oder Du schreibst - so wie Du es oben schon selbst angeregt hast - den "Zähler" in eine Datei und liest diesen dann aus. Was genau fehlt Dir denn für die Umsetzung der Zählvariable?


live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''

#6 MurdocX

MurdocX

    Board Veteran

  • 585 Beiträge

 

Geschrieben 02. Mai 2017 - 13:04

Um das Skript am "leben" zu halten, könntest du es einmal am Tag via der Aufgabenplanung starten und es läuft den ganzen Tag durch.

$Date = (Get-Date).ToShortDateString()

do
{
  ...
  ...
  
  Start-Sleep -Seconds 300 # 5 Minuten warten...
} while ( ((Get-Date).ToShortDateString()) -eq $Date )

Mit freundlicher Unterstützung
Jan


#7 Sebialt

Sebialt

    Newbie

  • 9 Beiträge

 

Geschrieben 02. Mai 2017 - 13:53

Was genau fehlt Dir denn für die Umsetzung der

 

Die Anzahl kann ich mir in eine Datei schreiben (müsste so eigentlich gehen)

$VarA = Select-String -path "Pfad\Error.log" -Pattern "Error1"
$VarA.Matches.Count | Out-File -Filepath "Pfad\Flag.txt"

Aber wie kann ich das mit der Anzahl eines neuen Durchlaufs vergleichen?



#8 BOfH_666

BOfH_666

    Junior Member

  • 146 Beiträge

 

Geschrieben 02. Mai 2017 - 14:17

Du liest den Inhalt der Datei mit Get-Content ein. Dabei erhältst Du einen String. Den kannst Du zum Integer "casten" und kannst das dann mit Deinem $VarA.Matches.Count vergleichen.  ... also ungefähr so

[INT]$SavedCount = Get-Content -Path "Pfad\Flag.Txt"

... jetzt hast Du die vorher dort gespeicherte Anzahl in der Variablen $SavedCount und kannst damit weiterspielen.   ;)


... was mir noch einfällt ... Du müsstest dann vielleicht noch das Datum der Datei Flag.txt mit beachten, damit Du nicht beim ersten Durchlauf des Tages den "Error-Count" mit dem Vortag vergleichst.  ;)


live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''

#9 Sebialt

Sebialt

    Newbie

  • 9 Beiträge

 

Geschrieben 02. Mai 2017 - 14:23

Das werde ich testen, komme aber erst am Donnerstag dazu.

Danke schon mal.  :thumb1:



#10 daabm

daabm

    Expert Member

  • 2.111 Beiträge

 

Geschrieben 06. Mai 2017 - 11:41

Hm - in den Logs, die ich so schreibe, hat jeder Eintrag einen Zeitstempel. Wenn das bei Dir auch so ist, müßtests Du ja nur den Zeitstempel extrahieren und Dir merken...


Greetings/Grüße, Martin

Mal ein gutes Buch über GPOs lesen? Oder ein kleines, aber feines Blog darüber?

Und wenn mir die IT mal auf die Nerven geht - coke bottle design refreshment (-: