tiny.deluxe
Goto Top

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

Content-Key: 339399

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

Printed on: April 23, 2024 at 19:04 o'clock

Mitglied: 133417
Solution 133417 May 31, 2017 updated at 10:18:16 (UTC)
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
Member: tiny.deluxe
tiny.deluxe May 31, 2017 at 11:14:01 (UTC)
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