Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Log Dateien automatisch auswerten



  • Please log in to reply
38 replies to this topic
CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Hallo liebe Mitstreiter,

 

ich habe ein spezielles Problem:

In einem Ordner werden mehrmals pro Tag Logfiles erstellt.

Logfile1.log

Logfile2.log

 

Es müsste also im betreffenden Ordner nach allen Logfiles gesehen werden:
Also im Stil: *.log - Außerdem möchte ich jeweils nur die ersten 9 Zeilen der Logfiles hintereinander, also am Besten in einer Datei angezeigt bekommen.

Mit LoopReadFile sollte das ja möglich sein, allerdings erschliesst sich mir die Syntax nicht.

Ich habe Folgendes gefunden, allerdings weiss ich nicht wie ich es anpassen muss:

Loop
{
FileReadLine, Line, %File%, %A_Index% ; Reads line N (where N is loop iteration)
if Errorlevel ; If line does not exist, break loop
    break
Text .= A_Index ". " Line . "`n" ; Appends the line to the variable "Text", adding line number before & new line after
}
 
; --> Delivers the output as a text file
 
FileDelete, Output.txt ; Makes sure output is clear before writing
FileAppend, %Text%, Output.txt ; Writes the result to Output.txt
Run Output.txt ; Shows the created file

Kann mich Jemand erleuchten?



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Wieso nicht einfach den ganzen File lesen?

Loop, %OrderName%*.log
{
FileRead,Outputvar,%A_LoopFileName%
File.="`n" OutputVar
}
Msgbox % File

Visit the new forum ahkscript.org.

http://ahkscript.org


strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

txt := ""
loop, *.log
    loop, read, a_loopfilefullpath
        if (a_index > 9)
            break
        else
            txt .= a_loopreadline "`n"
msgbox,% txt

Regards,
Babba

Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

In einem Ordner werden mehrmals pro Tag Logfiles erstellt

 

Wenn die Größe der Logs in der Summe nicht den Speicher des Rechners sprengt, unterstütze ich erst mal die Frage von nnnik, weil das die einfachste und schnellste Methode ist, WENN man nicht etwas ganz spezielles und anderes im Sinn hat...

 

Geht es NUR um die Anzeige der ersten 9 Zeilen?

 

Probier das mal an einer einzelnen Datei. Wenn das tut, was es soll, kannst du das ja in eine Schleife packen

FileRead, Content, Logfile1.log ; Log in eine Variable einlesen
StringGetPos, Length, Content, `n, L9 ; die Anzahl der Zeichen bis zum 9. Vorkommen (von 'links') eines Zeilenumbruchs feststellen
Die_Ersten_Neun_Zeilen := SubStr(Content, 1, Length) ; Die Zeichen vom 1. bis zum x. (s.o.) Zeichen einer anderen Variablen zuweisen
MsgBox % Die_Ersten_Neun_Zeilen

Insgesamt könnte das dann z.B. so aussehen

Loop, D:\Logs\Logfile*.*
{
    FileRead, Content, %A_LoopFileLongPath%
    StringGetPos, Length, Content, `n, L9
    AllStuff .= "==[" A_LoopFileName "]==`n" SubStr(Content, 1, Length) "`n"
}
MsgBox,4160,, % AllStuff

//Edit

ohh.. das von Babba finde ich hübscher. Gerade erst gesehen happy.png


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

@nnnik

 

Vielen Dank für Deine Hilfe...
 

 

Wieso nicht einfach den ganzen File lesen?

Weil nur die ersten 9 Zeilen wirklich relevante Informationen enthalten. Sollte im Backup ein Fehler aufgetreten sein, kann ich das hier auch sehen. Und dann kann ich mir immer noch das gesamte Logfile ansehen.
Aber schließlich geht es auch darum das ich mir bei 10 Logdateien nicht die kompletten Dateien ansehen muss, wenn zum Beispiel 9 erfolgreich waren...

---------------------------------------------------------------------------------------------------------------

@Babba

das sieht sehr gut aus, vielen Dank dafür.

---------------------------------------------------------------------------------------------------------------

@Seidenweber

auch dafür meinen Dank, ich werde mal Babba´s Vorschlag testen. Vielleicht wird es auch eine Kombination werden.



CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Ich habe mir erlaubt Babba´s und Seidenweber´s Vorschläge leicht zu kombinieren.

Was mich noch etwas stört ist das die gelesenen Dateien "aneinanderkleben".
Wo kann das Einfügen eines weiteren Zeilenumbruches realisiert werden, der dann die einzelnen Blöcke strukturiert?
Oder halt eine Linie! ------------------------------------------------------------------------------------------------------------------------------

; ------------ Variable fuer den Logfilereader - immer an den Anfang eines Scriptes -----------------
PfadzurLogdatei := "D:\zzzz_Batch_Logfiles\"
; ---------------------------------------------------------------------------------------------------


; --------------------- Logfilereader ---------------------------------------
Loop, %PfadzurLogdatei%*.log
Loop, read, %a_loopfilefullpath%
If (a_index > 9) ; wenn mehr als 9 Zeilen in einer Logdatei enthalten sind, lies nur die ersten 9 Zeilen aus
Break
else
Text .= a_loopreadline "`n"

; ---------------------------------------------------------------------------------
; Schreibt die Ergebnisse in die Textdatei Backup.txt und zeigt diese an
; ---------------------------------------------------------------------------------
 
FileDelete, Backup.txt ; Alte Backup.txt Datei wird geloescht
FileAppend, %Text%, Backup.txt ; Schreibt die Infos der Logdateien in die Backup.txt
Run Backup.txt ; Zeigt die geschriebene Datei auch gleich an...

; Ausgabe als MsgBox
; MsgBox,4160,, % Text


strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

txt := ""
loop, *.log
    {
    txt .= "----------------[" a_loopfilefullpath "]----------------`n"
    loop, read, a_loopfilefullpath
        if (a_index > 9)
            break
        else
            txt .= a_loopreadline "`n"
    }
msgbox,% txt

Regards,
Babba

CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Hallo Babba,

 

vielen Dank für Deine Mühe.
Ich habe es noch ein bisschen meinen Bedürfnissen angepasst, vielleicht kann es noch Jemand gebrauchen.
 

; ------------ Variablen fuer den Logfilereader - immer an den Anfang eines Scriptes ----------------
PfadzurLogdatei := "D:\zzzz_Batch_Logfiles\"
txt := ""
; ---------------------------------------------------------------------------------------------------



; --------------------- Logfilereader --------------------------------------------
Loop, %PfadzurLogdatei%*.log
    {
     txt .= "`n`n----------------[" A_LoopFileName "]----------------`n`n" ; zeigt den Namen des Logfiles (nicht den Pfad) und den Inhalt der ersten 9 Zeilen an - %% darf nicht verwendet werden
    loop, read, %A_LoopFileFullPath% ; Die Variable muss in %% eigebettet sein, andernfalls wird der Logfile Inhalt nicht angezeigt
        if (a_index > 9) ; wenn mehr als 9 Zeilen in einer Logdatei enthalten sind, lies nur die ersten 9 Zeilen aus
            break
        else
            txt .= a_loopreadline "`n"
    }

; ---------------------------------------------------------------------------------
; Schreibt die Ergebnisse in die Textdatei Backup.txt und zeigt diese an
; ---------------------------------------------------------------------------------
 
FileDelete, Backup.txt ; Alte Backup.txt Datei wird geloescht
FileAppend, %txt%, Backup.txt ; Schreibt die Infos der Logdateien in die Backup.txt
RunWait Backup.txt ; Zeigt die geschriebene Datei auch gleich an...
; --------------------- ENDE Logfilereader ---------------------------------------

Selbstverständlich wäre zum Schluß auch eine MsgBox möglich.
Bei sehr vielen Backup Dateien würde dies aber den Rahmen sprengen. Weiiterhin läßt sich eine Textdatei natürlich auch einfacher nach Fehlermeldungen durchsuchen!!!



CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Automatische Auswertung der Backup.txt:

 

Schön wäre noch wenn hier tatsächlich eine automatische Auswertung erfolgen könnte:

.....

FileDelete, Backup.txt ; Alte Backup.txt Datei wird geloescht
FileAppend, %txt%, Backup.txt ; Schreibt die Infos der Logdateien in die Backup.txt
Loop, read, %PfadzurLogdatei%Backup.txt
{
IfInString, A_LoopReadLine, family, FileAppend, %A_LoopReadLine%`n
}

Allerdings weiß ich nicht genau wie ich IfInString dazu anpassen müsste.

Folgende Meldungen würden einen Fehler darstellen:

Die folgenden Elemente haben ungelöste Konflikte und werden nicht synchronisiert werden
Synchronisation mit Fehlern abgeschlossen

Synchronisation mit Warnungen abgeschlossen
 

Diese 3 Zeilen sollen gesucht werden, wie kann ich das realisieren?
Mein erster Versuch ist offensichtlich falsch, denn die MsgBox für den Fehler wird immer angezeigt!

; ------------ Variablen fuer den Logfilereader - immer an den Anfang eines Scriptes ----------------
PfadzurLogdatei := "D:\zzzz_Batch_Logfiles\"
txt := ""
FFSyncVar1 := "Die folgenden Elemente haben ungelöste Konflikte und werden nicht synchronisiert werden"
FFSyncVar2 := "Synchronisation mit Fehlern abgeschlossen"
FFSyncVar3 := "Synchronisation mit Warnungen abgeschlossen"
; ---------------------------------------------------------------------------------------------------



; --------------------- automatische Auswertung des Logfiles ----------------------
Loop, read, %PfadzurLogdatei%Backup.txt
{
IfInString, FFSyncVar1, %A_LoopReadLine%
IfInString, FFSyncVar2, %A_LoopReadLine%
IfInString, FFSyncVar3, %A_LoopReadLine%
{
MsgBox, Fehler bei der Synchronisation / Datensicherung.`n`nBitte die Logdateien checken!!!
break
}
IfNotInString, FFSyncVar1, %A_LoopReadLine%
IfNotInString, FFSyncVar2, %A_LoopReadLine%
IfNotInString, FFSyncVar3, %A_LoopReadLine%
{
break
MsgBox, Die Synchronisation / Datensicherung war erfolgreich!!!
}
}
; ------------------- ENDE automatische Auswertung des Logfiles -------------------

Ich bin mir nicht sicher ob das so funktionieren kann.
Vielen Dank für die Hilfe im Voraus...
 



Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011
; --------------------- automatische Auswertung des Logfiles ----------------------
Loop, read, %PfadzurLogdatei%Backup.txt
{
IfInString, FFSyncVar1, %A_LoopReadLine% ; wird bei jeder neu eingelesenen Zeile ausgeführt
IfInString, FFSyncVar2, %A_LoopReadLine% ; wird ausgeführt, wenn das Ergebnis aus Zeile 4 wahr ist
IfInString, FFSyncVar3, %A_LoopReadLine% ; wird ausgeführt, wenn das Ergebnis aus Zeile 5 wahr ist
{ ; wird ausgeführt, wenn das Ergebnis aus Zeile 6 wahr ist - dafür muss aber auch das aus 5 und 4 wahr sein -> also nie
MsgBox, Fehler bei der Synchronisation / Datensicherung.`n`nBitte die Logdateien checken!!! 
break
}

Du könntest evtl. das (speziell NOT, AND, OR) und das und das und das lesen, um das Grundprinzip besser zu verstehen.

 

Zusatzfrage: Die benötigten Informationen stehen alle in den ersten 9 Zeilen ?


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Hallo Seidenweber,

 

vielen Dank für Deine Erklärung. Ich hatte mich schon belesen (hier auch) und auch einige Tests durchgeführt, bevor ich das hier gepostet habe.
Meine ersten Versuche sahen so aus:
IfInString, (Text = "FFSyncVar1" or Text = "FFSyncVar2" or Text = "FFSyncVar3"), %A_LoopReadLine%
oder
IfInString, ("FFSyncVar1") or ("FFSyncVar2") or ("FFSyncVar3"), %A_LoopReadLine%

Das ist aber alles falsch und funktioniert nicht. Ich bin mir auch nicht sicher ob A_LoopReadLine überhaupt notwendig ist.

Mit RegExMatch würde ich meinen könnte es besser funktionieren, aber die notwendige Syntax erschliesst sich mir leider nicht vollständig.
 

Zusatzfrage: Die benötigten Informationen stehen alle in den ersten 9 Zeilen ?

In der ersten 11 Zeilen, ich habe das in meinem Script angepasst.
 

Du könntest evtl. das (speziell NOT, AND, OR) und das und das und das lesen, um das Grundprinzip besser zu verstehen.

Habe ich gelesen, bringt mich leider kein Stück weiter. Es kann doch nicht unmöglich sein, in einer Textdatei 3 bestimmte Texte zu suchen die genau so wie geschrieben sind:

Die folgenden Elemente haben ungelöste Konflikte und werden nicht synchronisiert werden
Synchronisation mit Fehlern abgeschlossen

Synchronisation mit Warnungen abgeschlossen

Falls das Problem nicht lösbar ist, dann ist es eben so, ich kann mir ja auch die Textdatei weiterhin anzeigen lassen, und gut ist es.
Vielen Dank für Deine Hilfe.



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

IfInString, ("FFSyncVar1") or ("FFSyncVar2") or ("FFSyncVar3"), %A_LoopReadLine%

Geht leider nicht so.

Du musst einzelne Befehle benutzen.

 If (InStr("FFSyncVar1",A_LoopReadLine)||InStr("FFSyncVar2",A_LoopReadLine)||InStr("FFSyncVar3",A_LoopReadLine))

Visit the new forum ahkscript.org.

http://ahkscript.org


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Danke nnnik für Deine Hilfe.

Hierzu noch zwei Verständnisfragen:
Ich nehme mal an das    >>>>> || <<<<<   dazu führt das die Befehle als UND / ODER betrachtet werden?
Prüft A_LoopReadLine den genauen Wortlaut einer Zeile? Die Software ergänzt natürlich die Fehlermeldung um die betreffende Datei.
Dies bedeutet das der genaue Text in der Zeile vorkommt, aber eben nicht nur!

Vielen Dank für die Erklärung im Voraus.

 



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

|| ist ein oder

 A_LoopReadLine prüft den genauen Wortlaut.


Visit the new forum ahkscript.org.

http://ahkscript.org


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Danke nnnik für die Erklärung...

Allerdings habe ich jetzt:
 

; --------------------- automatische Auswertung des Logfiles ----------------------
Loop, read, %PfadzurLogdatei%Backup.txt
{
If (InStr("FFSyncVar1",A_LoopReadLine)||InStr("FFSyncVar2",A_LoopReadLine)||InStr("FFSyncVar3",A_LoopReadLine))
{
MsgBox, Fehler bei der Synchronisation / Datensicherung.`n`nBitte die Logdateien checken!!!
break
}
Else
{
MsgBox, Die Synchronisation / Datensicherung war erfolgreich!!!
break
}
}
; ------------------- ENDE automatische Auswertung des Logfiles -------------------

Und der Fehler wird immer angezeigt, obwohl keine der 3 Variablen im Text vorhanden ist. Hat noch Jemand eine Idee???


Edited by CodeNewbee, 22 August 2013 - 08:21 AM.