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-Key: 22401

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

Printed on: April 25, 2024 at 04:04 o'clock

Member: Biber
Biber Dec 28, 2005 at 18:57:47 (UTC)
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]
Member: Micha1982
Micha1982 Dec 29, 2005 at 08:33:34 (UTC)
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
Member: Micha1982
Micha1982 Jan 04, 2006 at 07:17:04 (UTC)
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
Member: Biber
Biber Jan 04, 2006 at 18:27:33 (UTC)
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