tranministrator
Goto Top

Mail wenn im LOG ein Fehler vorkommt

Sehr geschätzte IT Kollegen!

folgende Logzeilen werden in ein File unter dem Ordner \LOG\Kunde abgelegt. Das File ist permanent im Zugriff durch einen Dienst.
Das Log File wird am Ende des Tages, ca. 19:00 unter \LOG\Kunde\2020-03\ mit einem YYYY-mm-DD Zeitstempel verschoben.

Idealwert --> Interessiert uns nicht wirklich, schön dass es geklappt hat.
2020-03-04 17:03:52,842 [INFO ] [Client : send] - sending of receipt 11002100210015237 was successful

Schlechte Werte, diese interessieren uns. Diese können sich auch immer wieder mit der gleichen ID wiederholen da es einen permanenten Retry (ca. alle 3 Minuten) gibt.
2020-03-04 17:00:35,411 [WARN ] [Client : send] - sending of ID 11001100110007172 failed, response status was 400
2020-03-04 17:00:35,412 [ERROR] [Client : log] - exception while processing receipt -> 400: {"error":"invalid_grant","error_description":"authentication failure"}

Die Anforderung:
Es muss eine Mail gesendet werden, wenn WARN und/oder ERROR auftaucht. Idealerweise die ganze Zeile in den Body.
Die Mail soll sich nicht bei gleichem Fehler (gleiche Zeile, nur anderer Zeitstempel) wiederholen.

Als Backup wäre hier auch toll wenn aus dem Ordner \LOG\Kunde\2020-03\ die Datei von gestern mit durchsucht werden könnte und bei Fehler gesendet wird. Da evtl. eine gesonderte Mail.

Hat hier jemand Erfahrung wie man so etwas einrichten kann?

Vielen Dank

Mfg

Robert

Content-ID: 554138

Url: https://administrator.de/contentid/554138

Ausgedruckt am: 26.11.2024 um 10:11 Uhr

117471
117471 04.03.2020 um 19:46:58 Uhr
Goto Top
Hallo,

meine Erfahrung ist, dass eine E-Mail nichts bringt.

Entweder Ihr ertrinkt mittelfristig in einer Flut an Statusmeldungen oder es fühlt sich keiner zuständig. Gerade wenn die E-Mail nachts kommt oder an einen Verteiler geht...

Ansonsten können das alle Monitoring Tools wie Icinga2 usw.

Gruß,
Jörg
satosan
satosan 05.03.2020 aktualisiert um 01:00:46 Uhr
Goto Top
Kannst Du mit einem Batch-File machen >> https://ss64.com/nt/find.html .... Dann das entsprechende log scannen und wenn Du einen Treffer hast, den Text in ein File kopieren, dann mit ssmtp (wenn Du unter Linux arbeitest) den Inhalt des Files als Email schicken. Ganz einfach.


Viel Glueck.

Sato
117471
117471 05.03.2020 um 08:24:13 Uhr
Goto Top
Hallo,

für die Systemlast, die so ein Konstrukt erzeugt, kannst Du dir einen zweiten Server hinstellen.

Abgesehen davon möchte er eine Benachrichtigung,
keine Suche...

Gruß,
Jörg
satosan
satosan 05.03.2020 um 09:24:52 Uhr
Goto Top
1. Thread Openener schreibt nicht fuer wieviel Kunden und wie oft die Logs geschrieben werden.
2. Er schreibt nicht ob er die Benachrichtigung 'realtime' braucht oder erst am Abend wenn die Log-Datei um 19.00 Uhr verschoben wird.
3. Du kannst den Scan der Logs auf alle 3min ausdehnen, da ja erst dann der Retry gemacht wird.
4. Vielleicht sogar nur alle 10min um nur die letzten 3 Zeilen zu scannen und wenn dann 3mal WARN/ERROR auftaucht erst dann die Mail zu senden. Wir wissen ja nicht wodurch die WARN/ERROR herausgegeben werden.. Technischer Fehler oder Benutzer?
5. Die Jobs koennen alle parallel laufen.
6. SMMTP zum versenden von Mails ist so 'lightweight' ... MAIL == Benachrichtigung!!!
7. Vom logischen Ablauf her, kommt die SUCHE immer vor der BENACHRICHTIGUNG, wie soll er sonst wissen was zu BERICHTEN ist?
8. Um sowas noch leichgewichtiger zu machen, kann man sich vielleicht die Frage stellen, ob man alles was keine Warnung ist geloggt werden muss. Das sind dann aber Policy-Entscheidungen die nur der 'Thread Opener' beantworten kann.
9. Selbst wenn man einen 2. Server braeuchte bei richtiger 'real-time' Last. So eine Icinga Instanz will auch laufen und gepflegt werden. Und wenn Du Support moechtest wirst Du da auch zur Kasse gebeten und musst noch warten. So ein Batch-File oder von mir aus etwas in Python, Go etc. kann man selbst pflegen.

Lass ihn doch mal einige Einzelheiten nachliefern, dann werden wir schon etwas finden. Dann eruebrigt sich vielleicht Deine 'subjektive' Wahrnehmung und Meinung ueber die 'Flut von Statusmeldungen'.

Sato
Tranministrator
Tranministrator 05.03.2020 um 12:08:36 Uhr
Goto Top
1. Thread Openener schreibt nicht fuer wieviel Kunden und wie oft die Logs geschrieben werden.

Das ist für einen Kunden. Also kein großes Hexenwerk.

2. Er schreibt nicht ob er die Benachrichtigung 'realtime' braucht oder erst am Abend wenn die Log-Datei um 19.00 Uhr verschoben wird.

Benachrichtigung sollte realtime kommen, wenn dann aber nur einmalig. Weitere Meldungen mit anderer ID können gerne nochmal realtime kommen.

3. Du kannst den Scan der Logs auf alle 3min ausdehnen, da ja erst dann der Retry gemacht wird.

Gute Idee. In den 3 Minuten sollte das File auch nicht evt. durch eine Größenlimitbegrenzung von X (definierbar) verschoben werden.

4. Vielleicht sogar nur alle 10min um nur die letzten 3 Zeilen zu scannen und wenn dann 3mal WARN/ERROR auftaucht erst dann die Mail zu senden. Wir wissen ja nicht wodurch die WARN/ERROR herausgegeben werden.. Technischer Fehler oder Benutzer?

Technischer Fehler, z.B. kann es vorkommen, dass Daten im Online Portal nicht gepflegt sind.

5. Die Jobs koennen alle parallel laufen.
Kein Problem.

6. SMMTP zum versenden von Mails ist so 'lightweight' ... MAIL == Benachrichtigung!!!

SMTP ist kein Problem. Kundenvorgabe ist Mail.

7. Vom logischen Ablauf her, kommt die SUCHE immer vor der BENACHRICHTIGUNG, wie soll er sonst wissen was zu BERICHTEN ist?

8. Um sowas noch leichgewichtiger zu machen, kann man sich vielleicht die Frage stellen, ob man alles was keine Warnung ist geloggt werden muss. Das sind dann aber Policy-Entscheidungen die nur der 'Thread Opener' beantworten kann.

Warnungen und Errors sollen geloggt werden.

9. Selbst wenn man einen 2. Server braeuchte bei richtiger 'real-time' Last. So eine Icinga Instanz will auch laufen und gepflegt werden. Und wenn Du Support moechtest wirst Du da auch zur Kasse gebeten und musst noch warten. So ein Batch-File oder von mir aus etwas in Python, Go etc. kann man selbst pflegen.

Von Icinga habe ich nur mal kurz etwas gelesen. Programmierkenntnisse selbst habe ich leider keine.
satosan
satosan 05.03.2020 aktualisiert um 16:36:50 Uhr
Goto Top
Na wenn es nur ein Kunde ist, dann Batch-Script wie angedacht. Wenn sich das Log aendert, immer letzte Zeile auf WARN/ERROR scannen, die jeweilige Zeile:

1. lesen, kopieren und in eine Mail-File (z.Bsp. log-alerts.txt) schreiben. SSMTP (sendmail) kann daraus dann Betreff machen und die Email entsprechend senden.

Datei sieht dann aus wie:

To:alerts@kunde-xyz.com
From:alerts@diesntleister.com
Subject: Kopierter Text aus dem log

Mit 'sendmail -t < log-alerts.txt' dann automatisch die Email senden. Musst dann halt nur Sendmail einrichten. Ist aber super einfach.

Natuerlich kannst Du auch ein python-Script schreiben, das dann alles in einem macht.

Ich wuerde einfach einen Cron-Job auf 10min setzen, der das Log dann scannen kann. Dann den Inhalt des Logs in ein anderes Log kopieren und den Inhalt des aktuellen Logs loeschen. Dann dauert der aktuelle Scan auch nicht so lange und Du bekommst keine sich wiederholenden WARN/ERROR messages. Um 19.00 Uhr das gefuellte Log in den Ordner kopieren und fertig.

Aber, und das ist ganz wichtig aus den neuen Informationen, man braucht keinen 2. Server wenn es nur fuer einen Kunden ist ;)

Vg Sato

EDIT: Ich meinte SSMTP und nicht SMMTP. Sorry
143127
143127 05.03.2020 aktualisiert um 16:40:20 Uhr
Goto Top
Moin,
Such hier mal nach FileSystemWatcher da findet sich einiges dazu, z.B. zu deinem Thema habe ich hier gerade das hier im Forum gefunden:
Write-Progress
Wenn man das noch um Send-MailMessage mit der Logzeile und den gewünschten Keywords ergänzt hast du schon das gewünschte.
Tranministrator
Tranministrator 11.03.2020 um 23:05:27 Uhr
Goto Top
Servus!

So hätte ich es gemacht, leider ist dann die Logdatei blockiert, ich kann dort manuell keine weiteren Einträge speichern. In der Realität ist es auch so, dass ein Dienst die Logdatei im Zugriff hat und man diese z.B. nicht verschieben kann.

Fehlermeldung:

prozessjpg

Folgendes Skript wurde verwendet:

# Datei deren Inhalt überwacht werden soll
$file = gci "C:\Users\test\Desktop\TEMP\test\*.log" | sort LastWriteTime -Descending | select -First 1 -Expand Fullname  
# ---------
# variable enthält logfile inhalt für den kontinuierlichen Vergleich
$global:lastlog = gc $file
# Zeit der letzten Änderung
$global:lastchange = $null
# Eventuell existierenden Event subscriber löschen
Get-EventSubscriber FileChanged -EA SilentlyContinue | Unregister-Event -Force
# Filesystemwatcher erstellen
$fsw = New-Object IO.FileSystemWatcher (Split-Path $file -Parent), (Split-Path $file -Leaf) -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}   
# Filesystemwatcher registieren
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
    # Pfad zur Datei
    $fullpath = $Event.SourceEventArgs.FullPath
    # Änderungen nur verarbeiten wenn Zeit nicht exakt gleich ist (FSW Bugfix für doppelte Events)
    if ($global:lastchange -ne $Event.TimeGenerated){
        $global:lastchange = $Event.TimeGenerated
        # aktuellen Inhalt der Datei holen
        $currentData = (gc $fullpath)
        # Dateiinhalt vergleichen
        $changes = compare @($global:lastlog) @($currentData) -PassThru | ?{$_.SideIndicator -eq "=>"}  
        # wenn Änderungen da sind gebe sie auf der Konsole aus
        if ($changes -and $changes -match 'Error')#{  
           
            #Write-Host "Error registriert:" -f Yellow 
            #write-host ($changes | out-string) -BackgroundColor White -ForegroundColor Blue
           #$global:lastlog = $currentData
             
        #}
        {#& '.\mail.ps1' 
        Function sendmail($FROM,$TO,$BCC,$SUBJECT,$BODY,$ATTACHMENTS = $null ){
  $SMTPHOST = "smtp.test.com"  
  $SMTPPORT = "587"  
  $SMTPUSER = "test"  
  $SMTPClient = New-object System.Net.Mail.SmtpClient($SMTPHOST,$SMTPPORT)
  $SMTPClient.EnableSsl = $true
  $Mail = new-object System.Net.Mail.MailMessage
  $Mail.from = $FROM 
  $Mail.to.add($TO)
  $Mail.bcc.add($BCC)
    $SECURE= get-content "C:\Users\test\Desktop\TEMP\test\pass.txt" | convertto-securestring -key (1..16)  
  # Klartextpassword extrahieren
  $SMTPPASS = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SECURE)) 
  $SMTPClient.Credentials = new-object System.Net.NetworkCredential($SMTPUSER,$SMTPPASS) 
  $Mail.Subject = $SUBJECT
  $Mail.Body = $BODY
  # Add Attachments
  if ($ATTACHMENTS){
      foreach ($att in $ATTACHMENTS){
        $Mail.Attachments.Add($att.FullName)
      }
  }
  $SMTPClient.Send($Mail)
}
$files = dir "C:\Users\test\Desktop\TEMP\test\*.log"  
        sendmail "ABS" "EMPF" "CC" "test 1234567890" " " $files  
        $global:lastlog = $currentData
        }
    }
} | out-null

cls
write-host "Überwache Datei '$file' auf Änderungen..." -F Green  
while($true){sleep 1}

Hat jemand eine Idee wie man das so umbauen kann, dass es funktioniert?
Ich bin mir auch nicht so ganz sicher, ob das Skript einmal gestartet wird und dann durchläuft oder ob es alle 5 Minuten gestartet werden muss.

Viele Grüße

Robert
143127
143127 12.03.2020 aktualisiert um 07:21:16 Uhr
Goto Top
Du hast das Skript offensichtlich überhaupt nicht verstanden, erstens hast du essentielle Stellen auskommentiert, zweitens handelt es sich hierbei um ein Event das immer automatisch ausgeführt wird wenn sich etwas an einer Datei ändert, deswegen ja der Filesystemwatcher! Register-ObjectEvent ist Asynchron und führt den Event-Body immer bei Eintreten von Ereignissen aus!
Deine doppelt gemoppelte Schleife im Event-Body ist da kontraproduktiv, deswegen auch der Fehler!
Das Skript muss nur einmal aufgerufen werden und läuft dann im Hintergrund.
Läuft hier auch testweise problemlos, deine eigenen Modifikationen weil das Skript nicht verstanden wurde sind der Fehler!
Also lies dich doch einfach nochmal in dir Funktionsweise der Befehle ein dann verstehst du es vielleicht auch.