micha1982
Goto Top

Batch Script zum Auswerten einer Logdatei

[Edit] Aus meiner Sicht beantwortet. Biber [/Edit]

Hallo,

ich hoffe ihr könnt mir bei folgendem Problem weiterhelfen.

Ich versuche mit einem CMD-Script zu prüfen ob in eine Logdatei neue Einträge geschrieben werden, mit dem Hintergrund das bei neuen Einträgen eine Mail versendet werden soll.
Das Script soll minütlich diese Logdatei pollen.

Mein Lösungsansatz ist die Einträge in der Logdatei zu zählen um dann bei einer Abweichung des Zählerstandes die Mailbenachrichtigung auszulösen.
Dazu verwende ich folgenden Befehl in dem Script:

FOR /F "delims=" %%A IN (D:\TEST\tmp1.txt) DO SET /A COUNTER=%COUNTER% + 1

Jedoch zählt er nicht nach jeder Zeile den Counter um 1 hoch sondern erst wenn er alle Einträge in der Logfile durchlaufen hat... wie müsste der Befel lauten damit er jede Zeile zählt???
Bin auch für andere Lösungsansätze offen.

Gruß,

Michael

Content-ID: 22401

Url: https://administrator.de/forum/batch-script-zum-auswerten-einer-logdatei-22401.html

Ausgedruckt am: 15.03.2025 um 10:03 Uhr

Biber
Biber 28.12.2005 um 19:57:47 Uhr
Goto Top
Moin Micha1982,

drei Möglichkeiten wüßte ich, wahrscheinlich gibt es noch ein paar mehr.
a) Die einfachste (und undokumentierteste):
Set /A "Counter=0"
FOR /F "delims=" %%A IN (DeineDatei) DO SET /A "COUNTER+=1"

Die beiden dokumentierten (na ja, für M$-Verhältnisse dokumentierten):
b)
...
Setlocal enableDelayedExpansion
Set /A "Counter=0"
FOR /F "delims=" %%A IN (DeineDatei) DO SET /A "COUNTER=!Counter!+1"
Setlocal disableDelayedExpansion
...
c)
...
Set /A "Counter=0"
FOR /F "delims=" %%A IN (DeineDatei) DO call :aMiniSub
:aMiniSub
SET /A "COUNTER=%Counter%+1"
goto :eof
...
Ich denke, alle 3 Möglichkeiten sind auch im Bereich "Batch & Shell" in den Tutorials beschrieben.

HTH Biber
[Edit]
P.S. Zum Thema anderer Lösungsansatz:
Ich würde, speziell wenn es um größere Logdateien geht, eher als Strategie über das letzte Änderungsdatum der Datei gehen.
Das heißt, in einer einzeiligen Mini-Text-Datei den zuletzt vom Batch geprüften Datum/Zeitwert speichern und diesen mit dem aktuellen Timestamp vergleichen.
Anderenfalls musst Du ja jedesmal durch alle Zeilen der Logdatei wackeln, auch um möglicherweise festzustellen, dass die Logdatei dieses Mal 47.666 Zeilen hat und dass esvor einer Minute auch schon genauso war...ist nicht sonderlich performant.
Und die "zuletzt gelesene Zeilenzahl" musst Du da auch irgendwo "Dir merken", also speichern. Ist von daher ja keine große Änderung.
[/Edit]
Micha1982
Micha1982 29.12.2005 um 09:33:34 Uhr
Goto Top
Hi Bieber,

erstmal Danke für die Antwort das bringt mich schon ein Stückchen weiter.

Das mit dem Änderungsdatum der Logdatei gestaltet sich leider etwas schwierig, da die Logdatei der Applikation alle 5 Minute komplett neu geschrieben wird, unabhängig davon ob ein neuer Eintrag hinzugefügt wird oder nicht.

Ein weiteres "Problem" ist das die Logdatei nur die Werte der letzten 30 Tage enthält, also die Dateigröße auch schlecht als Auswahlkriterium verwendet werden kann. Andererseits bleibt die Logdatei somit aber in einem gewissen Rahmen was die Größe angeht...

Fällt dir noch eine andere Möglichkeit ein?

Gruß,

Michael
Micha1982
Micha1982 04.01.2006 um 08:17:04 Uhr
Goto Top
Hallo habe nun folgendes Script als Lösung des Problems und es funktioniert bisher ohne Probleme face-smile Danke an Biber für die Unterstützung.

::VARIABLEN
SET WORKDIR=Programmpfad
SET BLAT=D:\BLAT\blat.exe

SET LOG1= Pfad für Logdatei Mandant 1
SET LOG1_COPY=Pfad für Logdateikopie Mandant 1

SET LOG2= Pfad für Logdatei Mandant 2
SET LOG2_COPY= Pfad für Logdateikopie Mandant 2

SET TMP1=%WORKDIR%\tmp1.txt
SET TMP2=%WORKDIR%\tmp2.txt

SET /A MAIL1=0
SET /A MAIL2=0

::MAIN
FOR /F "eol= delims=. tokens=1,2,3" %%A IN ("%DATE%") DO SET "DATEFORM=%%C-%%B-%%A"
CALL :CHK1
CALL :CHK2
CALL :MAIL
GOTO :EOF

::SUBS

:CHK1
ECHO Folgende Dateien wurden gedruckt:>%TMP1%
FC %LOG1% %LOG1_COPY% | FIND "%DATEFORM%">>%TMP1%
IF "%ERRORLEVEL%"=="0" (COPY %LOG1% %LOG1_COPY% && SET /A MAIL1=1) ELSE
GOTO
:QUIT
GOTO :EOF

:CHK2
ECHO Folgende Dateien wurden gedruckt:>%TMP2%
FC %LOG2% %LOG2_COPY% | FIND "%DATEFORM%">>%TMP2%
IF "%ERRORLEVEL%"=="0" (COPY %LOG2% %LOG2_COPY% && SET /A MAIL2=1) ELSE
GOTO
:QUIT
GOTO :EOF

:MAIL
IF "%MAIL1%"=="1" %BLAT% %TMP1% -to email@kunde.de -subject "Ausdruck auf
Drucker Mandant1" -sig %WORKDIR%\sig.txt
IF "%MAIL1%"=="1" %BLAT% %TMP2% -to email@kunde.de -subject "Ausdruck auf
Drucker Mandant2" -sig %WORKDIR%\sig.txt
GOTO :EOF

:QUIT
EXIT

Gruß,

Michael
Biber
Biber 04.01.2006 um 19:27:33 Uhr
Goto Top
Dir auch danke fürs Veröffentlichen, Micha,

und ich setze den Beitrag jetzt mal auf Closed.

Schönen Abend und bis zum nächsten Batch face-wink
Biber