tiny.deluxe

Datumbezogenes Auslesen von Logfiles

Hallo zusammen,
ich bin neu hier im Forum und habe ein Problem mit einem Batch. Es geht darum ein Logfile auszuwerten das über einen Monat lang täglich befüllt wird.
Dateiname: PG-2017-05.log
Inhalt:
30 20:17:43 INFO Programm start
30 20:17:48 INFO Listen für alle Systeme erstellen...
30 20:22:33 INFO Daten ermitteln für XXXXXX....
30 20:22:35 INFO Daten ermitteln zum Datum '05/31/2017 00:00:00'...
30 20:48:05 INFO Program done.
Das Programm schreibt z.B. am 31.05. Meldungen für den Vortag rein, also den 30.05.

Was ich jetzt abzufangen versuche sind solche Meldungen:
24 06:57:40 INFO Programm start
24 06:57:41 ERROR Program System.FormatException: String was not recognized as a valid DateTime.
at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
at Program.Main()

Gelöst habe ich es bisher so:
@echo off & setlocal 
set "Pfad=K:\Programm\Logs"  
set "Checklog=fehler_programm.txt"  
if exist %Pfad%\%Checklog% del %Checklog%


for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x  
set today=%MyDate:~0,4%-%MyDate:~4,2%
set day=%MyDate:~6,2%
echo %today%

set "Logdatei=%Pfad%\PG-%today%.log"   
set "ziel=%Pfad%\%Checklog%"  

for %%a in (%Logdatei%) do @(
						for /f "tokens=1,3 delims=" %%b in ('findstr /ic:"ERROR" "%%a" 2^>nul') do @( >>"%ziel%" echo %%b %%c   
						)

)
rem if exist %Pfad%\%Checklog% goto mail
goto :eof

:mail
C:\IS\util_blat\blat %Pfad%\%Checklog% -subject "Fehler bei Programm" -to mymail@mymailserver.com -i "absender@mymailserver.com"  
goto :eof

Das funktioniert wunderbar, würde mir aber jeden Tag eine Fehlermail verschicken obwohl an diesem Tag kein Fehler aufgetreten ist. Rein theoretisch wüsste ich was ich machen muss, aber leider bin ich überhaupt nicht fit in Batchprogrammierung (dieses Programm habe ich mir mit Codeschnipseln u.a. von Eurer Seite zusammengefummelt face-wink) somit kann ich das nicht in Code fassen.

Es müsste also am Anfang der Zeile nach dem Tag geguckt werden der den Logeintrag "verursacht" hat im obigen Beispiel also 30, dann in dem Bereich nach "ERROR" suchen und diese Zeile in die "fehler_programm.txt" schreiben und per Mail verschicken.
Ich hoffe ich konnte mein Problem verständlich erklären und ihr könnt mir bei der Lösung helfen.

Vielen Dank schon mal im Voraus für's reindenken!

Viele Grüße
Elke
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 339399

Url: https://administrator.de/forum/datumbezogenes-auslesen-von-logfiles-339399.html

Ausgedruckt am: 05.05.2025 um 07:05 Uhr

133417
Lösung 133417 31.05.2017 aktualisiert um 12:18:16 Uhr
Goto Top
Hallo.
Mach doch einfach noch ein findstr in die For-Schleife in Zeile 16 die nach dem Tag am Zeilenanfang filtert:
for /f "tokens=1,3 delims=" %%b in ('findstr /ic:"ERROR" "%%a" 2^>nul ^| findstr /b "%day%" 2^>nul') do @( >>"%ziel%" echo %%b %%c    
oder stattdessen gleich so
for /f "delims=" %%a in ('findstr /ib "%day%.*ERROR" "%Logdatei%" 2^>nul') do (  
 >>"%ziel%" echo(%%a  
)
Gruß v
tiny.deluxe
tiny.deluxe 31.05.2017 um 13:14:01 Uhr
Goto Top
Hi,
vielen Dank für Deine schnelle Antwort. Die zweite Version hat funktioniert. Ich habe mir noch ein Skript aus diesem Forum dazugeholt in dem ich den Vortag berechnen kann und jetzt sieht das gesamte Skript so aus:
@echo off & setlocal 

set "Pfad=K:\Programm\Logs"  
set "Checklog=fehler_programm.txt"  
if exist %Pfad%\%Checklog% del %Checklog%


for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x  
set today=%MyDate:~0,4%-%MyDate:~4,2%

set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=1000%date:~-10,2%
set /a vormonat=%monat%-1

if not %tag%==100001 set /a tag=%tag%-1 & goto end

for %%j in (0 1 3 5 7 8 10) do if %vormonat%==%%j set /a tag=100031 & goto end
for %%k in (4 6 9 11) do if %vormonat%==%%k set /a tag=100030 & goto end

set /a tag=100028
for /l %l in (2004,4, 2052) do IF %jahr%==%%l set /a tag=100029

:end
set tag=%tag:~-2,2%


set "Logdatei=%Pfad%\PG-%today%_test.log"   
set "ziel=%Pfad%\%Checklog%"  

for %%a in (%Logdatei%) do @(
						for /f "delims=" %%a in ('findstr /ib "%tag%.*ERROR" "%Logdatei%" 2^>nul') do (  
 >>"%ziel%" echo(%%a  
)
)
if exist %Pfad%\%Checklog% goto mail
goto :eof

:mail
C:\IS\util_blat\blat %Pfad%\%Checklog% -subject "Fehler bei Programm" -to mymail@mymailserver.com -i "absender@mymailserver.com"   
goto :eof

Ich hätte das bestimmt noch verkürzen können gerade die Geschichte mit der Datumsberechnung ist wahrscheinlich doppelt gemoppelt, aber das Dingens macht was es soll. face-smile

Vielen Dank & Viele Grüße
Elke