none
Textdatei mit Powershell Remote durchsuchen RRS feed

  • Frage

  • Hallo Community,

    ich würde gerne per Powershell Textdateien (Log Dateien einer Anwendung) auf 2 oder mehr Servern Remote durchsuchen und bei einem Bestimmten Ereignis in der Logdatei, eine Fehler anzeigen lassen.

    Meine Vorstellung:
    Ich Starte das Powershell Script welches lokal auf meinem Rechner läuft, und dieses alle paar Sekunden eine Anfrage an den/die Server stellt und die Log Dateien auf das Ereignis Scannt.
    Wenn jetzt in den Logfiles auf irgend einem der Server nun dieses Ereignis auftritt(z.B. "Error processing request"), soll ein Fehler gezeigt werden, am besten mit einem Popup auf meinem Client.

    Ist das mit Powershell möglich, gibt es so ein Script vielleicht schon, oder kann das so garnicht funktionieren ?
    Vielleicht hat jemand ein Tipp oder ein Wenig Codeschnippsel wie so etwas bewerkstelligt werden kann :)

    Vielen Dank

    Freitag, 24. März 2017 11:40

Antworten

  • ... manche professionelle Software lässt sich auch dazu 'überreden', die Meldungen statt in eine Log-Datei, oder vielleicht sogar zusätzlich zur Log-Datei ins Eventlog zu schreiben. Das ließe sich einfacher regelmäßig abfragen und auswerten.

    ...aber der Performance des Ganzen wäre es mit Sicherheit nicht zuträglich ;-)

    In der Sache:

    1. Wenn es Dir wirklich darum geht, alle paar Sekunden die Datei zu pollen, würde ich es definitiv lokal machen. Das kann trotzdem ein PowerShell-Skript sein, aber halt jeweils auf den Servern selbst ausgeführt.

    2. Je nachdem, wie groß die Logdatei ist und wie oft da neue Einträge dazu kommen, kann man das Ganze sicher gut optimieren.

    Beispiel 1: Es werden nur selten neue Einträge geschrieben und wenn, dann sind es vermutlich genau die, die Dich interessieren --> dann brauchst Du nicht alle paar Sekunden die Datei aufzumachen, sondern kannst erst mal auf den LastWrite-Zeitstempel schauen. Und nur, wenn er sich ggü. dem letzten Durchlauf ändert, in die Datei reingucken.

    Beispiel 2: Datei ist groß, ändert sich oft, aber die Einträge, die Dich interessieren, sind selten. Dann würde ich nicht mit den nativen PowerShell-Cmdlets (Get-Content usw.) arbeiten, sondern eher mit .NET-Methoden, die Offsets können (FileStream.Read oder so) und dann wirklich nur den Teil einlesen, den ich beim letzten Mal noch nicht gesehen habe... Das ist aber schon relativ fortgeschrittenes Zeug.

    Du kannst aber erst einmal so etwas wie

    Get-Content('C:\Logs\mylog.txt') | where {$_ -like "*ERROR*"}
    verwenden und schauen, ob es performance-technisch ein Problem wird.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Samstag, 25. März 2017 09:51
  •  

    Obwohl ich es tendenziell auch eher lokal auf jedem Server machen würde, lässt sich das auch durchaus von einem zentralen Rechner übers Netz machen. Das hängt vor allem davon ab, um wie viele Server es geht, wie oft das Log mit unwichtigen Einträgen beschrieben wird und wie viel Traffic beim Auslesen des Logs erzeugt wird.
    Am besten wäre es, wenn sich die Quelle des Logs so konfigurieren ließe, das das Log nur selten beschrieben wird, idealerweise sogar nur im Fehlerfall eine bestimmte Datei erzeugt bzw. in eine bestimmte Datei geschrieben wird.
    Generell kannst du die Server per Filesystemwatcher überwachen. Der Vorteil ist da, das du nur bei wirklichen Anderungen eine Aktion auslöst.

    Filesystemwatcher funktionieren auch übers Netz, selbst bei nicht-Windowsservern, in der Regel zuverlässig.
    Das sieht für ein Ziel etwa so aus:

    $watchDir = "\\MeinServer\Share"
    
    $FSW = New-Object System.IO.FileSystemWatcher
    $FSW.Path = $watchDir
    $FSW.InternalBufferSize = 65536
    $FSW.NotifyFilter = [System.IO.NotifyFilters]::LastWrite 
    
    while($true){
    	# Überwachte Änderungstypen
        $result = $FSW.WaitForChanged([System.IO.WatcherChangeTypes]::Changed -bor [System.IO.WatcherChangeTypes]::Renamed -bor [System.IO.WatcherChangeTypes]::Created, 2000);
        if($result.TimedOut){ continue }
    	
    	# Aktion im Falle einer Änderung
        write-host "Änderung in Datei: $($result.Name)"
    }
     

    Bei mehreren Verzeichnis/Servern müsstest man das (statt dem while-Loop) etwas anders bauen, aber zum Test reicht das erstmal. Das Verzeichnis sollte direkt das zu überwachende sein. Es gibt zwar die Option "IncludeSubdirectories" was aber auf Netzlaufwerken nicht wirklich klappt.

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Sonntag, 26. März 2017 19:28
    Moderator

Alle Antworten

  • > Ich Starte das Powershell Script welches lokal auf meinem Rechner läuft, und dieses alle paar Sekunden eine Anfrage an den/die Server stellt und die Log Dateien auf das Ereignis Scannt.
     
    Hm - Textdateien sind die denkbar schlechteste Quelle dafür... Du mußt die jedesmal neu öffnen und komplett durchsuchen, und das auch noch alle paar Sekunden und remote.
     
    > Vielleicht hat jemand ein Tipp oder ein Wenig Codeschnippsel wie so etwas bewerkstelligt werden kann :)
     
    Schau Dir mal den Logparser von MS an.
     
    Freitag, 24. März 2017 13:25
  • ... manche professionelle Software lässt sich auch dazu 'überreden', die Meldungen statt in eine Log-Datei, oder vielleicht sogar zusätzlich zur Log-Datei ins Eventlog zu schreiben. Das ließe sich einfacher regelmäßig abfragen und auswerten.

    Grüße - Best regards

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

    Freitag, 24. März 2017 15:56
  • ... manche professionelle Software lässt sich auch dazu 'überreden', die Meldungen statt in eine Log-Datei, oder vielleicht sogar zusätzlich zur Log-Datei ins Eventlog zu schreiben. Das ließe sich einfacher regelmäßig abfragen und auswerten.

    ...aber der Performance des Ganzen wäre es mit Sicherheit nicht zuträglich ;-)

    In der Sache:

    1. Wenn es Dir wirklich darum geht, alle paar Sekunden die Datei zu pollen, würde ich es definitiv lokal machen. Das kann trotzdem ein PowerShell-Skript sein, aber halt jeweils auf den Servern selbst ausgeführt.

    2. Je nachdem, wie groß die Logdatei ist und wie oft da neue Einträge dazu kommen, kann man das Ganze sicher gut optimieren.

    Beispiel 1: Es werden nur selten neue Einträge geschrieben und wenn, dann sind es vermutlich genau die, die Dich interessieren --> dann brauchst Du nicht alle paar Sekunden die Datei aufzumachen, sondern kannst erst mal auf den LastWrite-Zeitstempel schauen. Und nur, wenn er sich ggü. dem letzten Durchlauf ändert, in die Datei reingucken.

    Beispiel 2: Datei ist groß, ändert sich oft, aber die Einträge, die Dich interessieren, sind selten. Dann würde ich nicht mit den nativen PowerShell-Cmdlets (Get-Content usw.) arbeiten, sondern eher mit .NET-Methoden, die Offsets können (FileStream.Read oder so) und dann wirklich nur den Teil einlesen, den ich beim letzten Mal noch nicht gesehen habe... Das ist aber schon relativ fortgeschrittenes Zeug.

    Du kannst aber erst einmal so etwas wie

    Get-Content('C:\Logs\mylog.txt') | where {$_ -like "*ERROR*"}
    verwenden und schauen, ob es performance-technisch ein Problem wird.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Samstag, 25. März 2017 09:51
  •  

    Obwohl ich es tendenziell auch eher lokal auf jedem Server machen würde, lässt sich das auch durchaus von einem zentralen Rechner übers Netz machen. Das hängt vor allem davon ab, um wie viele Server es geht, wie oft das Log mit unwichtigen Einträgen beschrieben wird und wie viel Traffic beim Auslesen des Logs erzeugt wird.
    Am besten wäre es, wenn sich die Quelle des Logs so konfigurieren ließe, das das Log nur selten beschrieben wird, idealerweise sogar nur im Fehlerfall eine bestimmte Datei erzeugt bzw. in eine bestimmte Datei geschrieben wird.
    Generell kannst du die Server per Filesystemwatcher überwachen. Der Vorteil ist da, das du nur bei wirklichen Anderungen eine Aktion auslöst.

    Filesystemwatcher funktionieren auch übers Netz, selbst bei nicht-Windowsservern, in der Regel zuverlässig.
    Das sieht für ein Ziel etwa so aus:

    $watchDir = "\\MeinServer\Share"
    
    $FSW = New-Object System.IO.FileSystemWatcher
    $FSW.Path = $watchDir
    $FSW.InternalBufferSize = 65536
    $FSW.NotifyFilter = [System.IO.NotifyFilters]::LastWrite 
    
    while($true){
    	# Überwachte Änderungstypen
        $result = $FSW.WaitForChanged([System.IO.WatcherChangeTypes]::Changed -bor [System.IO.WatcherChangeTypes]::Renamed -bor [System.IO.WatcherChangeTypes]::Created, 2000);
        if($result.TimedOut){ continue }
    	
    	# Aktion im Falle einer Änderung
        write-host "Änderung in Datei: $($result.Name)"
    }
     

    Bei mehreren Verzeichnis/Servern müsstest man das (statt dem while-Loop) etwas anders bauen, aber zum Test reicht das erstmal. Das Verzeichnis sollte direkt das zu überwachende sein. Es gibt zwar die Option "IncludeSubdirectories" was aber auf Netzlaufwerken nicht wirklich klappt.

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Sonntag, 26. März 2017 19:28
    Moderator