tkline
Goto Top

Bereich eines Logfiles in ein separates File zusammenfassen inkl. Logfile Name

Hi,

hab da mal ne Frage:

Ich habe einen Ordner, in dem Logfiles im *.txt Format gespeichert werden.
Der Inhalt der txt-Files sieht in etwa so aus:
WARNING ( 145123): Sicherung nicht komplett
WARNING ( 121345): Fehler ist vernachlässigbar
ERROR ( 135214): Datei ist defekt.
INFO ( 234534): Heute ist ein schöner Tag
DEBUG ( 234230): Debugging successful

Ich möchte nun aus allen Logfiles die Werte Warning und Error
auslesen und in eine separate txt-Datei kopieren. Zusätzlich soll die
Bezeichnung des Logfiles dazugeschrieben werden, aus dem die Information
herausgezogen worden ist.

Das Endergebnis (logsummary.txt) soll ungefähr so aussehen:
Logfilename: 20071008_1647_import_log
ERROR ( 135214): Datei ist defekt.
WARNING ( 145123): Sicherung nicht komplett
WARNING ( 121345): Fehler ist vernachlässigbar

Logfilename: 20071008_1649_import_log
ERROR ( 135214): Datei ist defekt.
WARNING ( 145123): Sicherung nicht komplett

Ist das mit einem Batchfile machbar?


Würde mit folgendem Befehl z.B. find /i "ERROR ("
die Zeilen mit "Error" auslesen, aber dann verließen sie mich,
die geistigen Ergüsse der Programmierkunst.


Gruß
Tom

Content-Key: 71101

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

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

Member: Biber
Biber Oct 16, 2007 at 15:02:55 (UTC)
Goto Top
Moin tkline,

zum Testen am CMD-Prompt:
>for %i in (2007*.txt) do @for /f "delims=" %a in ('findstr /v "^INFO" "%i"^|findstr /v "^DEBUG"') do @echo %a  
WARNING ( 145123): Sicherung nicht komplett
WARNING ( 121345): Fehler ist vernachlässigbar
ERROR ( 135214): Datei ist defekt.

Im Batch ungefähr (ungetestet):
@for %%i in (2007*.txt) do @(
echo Logfilename %%i >>logfile_summary.txt
for /f "delims=" %%a in ('findstr /v "^INFO" "%%i"^|findstr /v "^DEBUG"') do @echo %%a >>logfile_summary.txt  
)

Gruß
Biber
Member: bastla
bastla Oct 16, 2007 at 16:02:15 (UTC)
Goto Top
... oder, um "positiv" zu filtern:
@echo off & setlocal
set "Summary=D:\logfile_summary.txt"  
set "Filter=WARNING ERROR"  

if exist "%Summary%" del "%Summary%"  
for %%i in (D:\2007*.txt) do (
	findstr /b "%Filter%" "%%i">nul && (  
		echo Logfilename: %%i
		for /f "delims=" %%a in ('findstr /b "%Filter%" "%%i"') do echo %%a  
		echo.
	)>>"%Summary%"  
)

Grüße
bastla
Member: tkline
tkline Oct 16, 2007 at 16:57:22 (UTC)
Goto Top
Zunächst mal danke für eure Lösungen.

Bei der Lösung von Biber funktioniert soweit alles einwandfrei.
Meine testdatei hat mit log*.txt angefangen und dann hat mir der
Batch in mein logfile_summary.txt auch gleich die logfile_summary.txt
mit ausgewertet. Aber das ist mein Fehler. Bin halt Anfängerface-wink

Bei der Lösung von Bastla finde ich die positive Filterung gut, damit
kann ich dann eventuell auftretende andere Codes neben DEBUG und INFO
erschlagen. Leider funktioniert das bei mir noch nicht, muß mal schauen
was ich da falsch eingebe.

Werde jetzt weiter rumprobieren.

Danke nochmal für eure Vorschläge, habt mir damit sehr weitergeholfen.


Grüße

Tom
Member: tkline
tkline Oct 17, 2007 at 08:31:23 (UTC)
Goto Top
Hi,
hab nun alles am laufen. Läuft alles wunderbar.
Hab das ganze noch mit einem Echo Befehl gekrönt, damit ich sehen kann wie
weit er die logs schon abgearbeitet hat. Danke euch!

Hätte dazu noch eine Frage:

Ist es möglich einen Filter zu setzen, der mir z.B. ein Warning bzw. eine ERROR Zeile
mit bestimmten Wörtern z.B. "WARNING ( 121345): Fehler ist vernachlässigbar" herausfiltert
also nicht mit übernimmt? Oder brauch ich dazu eine IF Anweisung?

Gruß
Tom
Member: bastla
bastla Oct 17, 2007 at 13:50:02 (UTC)
Goto Top
Hallo tkline!

Dann etwa so:
@echo off & setlocal
set "Summary=D:\logfile_summary.txt"  
set "PosFilter=WARNING ERROR"  
set "NegFilter=vernachlässigbar"  

if exist "%Summary%" del "%Summary%"  
for %%i in (D:\2007*.txt) do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
findstr /b "%PosFilter%" %1 |findstr /v "%NegFilter%">nul || goto :eof  
echo Logfilename: %~1 >>"%Summary%"  
findstr /b "%PosFilter%" %1 |findstr /v "%NegFilter%" >>"%Summary%"  
echo.>>"%Summary%"  
Falls sich die Negativfilter-Einträge auf einzelne Wörter (wie im Beispiel oben) beschränken lassen, diese einfach mit Leerzeichen getrennt anführen - ansonsten müssten mehrere "findstr /C:" hintereinander geschaltet werden.

Grüße
bastla
Member: tkline
tkline Nov 02, 2007 at 14:21:11 (UTC)
Goto Top
Hallo bastla,

Sorry für die späte Rückmeldung, hab deinen letzten Beitrag irgenwie übersehen.

Das ganze funktioniert so ganz super. Hab da noch eine Verständnisfrage:
Wenn ich anstatt nach einzelnen Wörtern nach ganzen Sätzen suchen lasse, dann kann ich das mit "findstr /C." regeln. Wie schreibe ich das unter dem Punkt NegFilter?
Hab hier versucht mit Anführungszeichen zu arbeiten, aber bekomme immer den Fehler
"Kann nicht geöffnet werden oder Fehler beim schreiben."

Eine Frage noch:
An welcher Stelle muss ich beim Ausführen des Batches den echo Befehl setzen, damit ich sehen kann welche Dateien er gerade abarbeitet?

Danke dir für deine bisherigen Bemühungen.

Gruß
Tom
Member: bastla
bastla Nov 02, 2007 at 16:26:08 (UTC)
Goto Top
Hallo tkline!

Wenn ich anstatt nach einzelnen Wörtern nach ganzen Sätzen suchen lasse, dann kann ich das mit "findstr /C." regeln. Wie schreibe ich das unter dem Punkt NegFilter?
Eigentlich so wie oben das einzelne Wort "vernachlässigbar", also mit je einem Anführungszeichen vor "NegFilter" und einem Anführungszeichen am Ende - zumindest wenn in Deinem Satz selbst keine Anführungszeichen enthalten sind.

An welcher Stelle muss ich beim Ausführen des Batches den echo Befehl setzen, damit ich sehen kann welche Dateien er gerade abarbeitet?
Wenn Du die Zeile
echo Logfilename: %~1 >>"%Summary%"  
nochmals ohne die Umleitung unmittelbar nach der Zeile ":ProcessFile" einfügst, wird der Name am Bildschirm angezeigt.

Zusammen mit den "findstr"-Änderungen für ganze Sätze würde demnach das ":ProcessFile"-Unterprogramm so aussehen:
:ProcessFile
echo Bearbeite Logfile: %~1
findstr /b "%PosFilter%" %1 |findstr /v /c:"%NegFilter%">nul || goto :eof  
echo Logfilename: %~1 >>"%Summary%"  
findstr /b "%PosFilter%" %1 |findstr /v /c:"%NegFilter%">>"%Summary%"  
echo.>>"%Summary%"  

Grüße
bastla
Member: tkline
tkline Nov 02, 2007 at 17:37:27 (UTC)
Goto Top
Hallo bastla,

Tausend Dank! Ich weiß jetzt was ich falsch gemacht hab. Ich hab versucht neben den
einzelnen Wörtern noch den Satz mit unterzubringen, deshalb hat das ganze nicht hingehauen.
Hab ewig rumprobiert und war schon verzweifeln.

Hab das ganze jetzt auf jeweils zwei Sätze ausgeweitet. So siehts nun fertig aus:

@echo off & setlocal
set "Summary=C:\log_summary.txt"  
set "PosFilter=WARNING ERROR"  
set "NegFilter=Sicherung nicht komplett"  
set "NegFilter2=Fehler ist vernachlässigbar"  

if exist "%Summary%" del "%Summary%"  
for %%i in (C:\logs\Log*.txt) do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
echo Bearbeite Logfile: %~1
findstr /b "%PosFilter%" %1 |findstr /v /c:"%NegFilter%">nul |findstr /v /c:"%NegFilter2%">nul| goto :eof  
echo Logfilename: %~1 >>"%Summary%"  
findstr /b "%PosFilter%" %1 |findstr /v /c:"%NegFilter%"|findstr /v /c:"%NegFilter2%">>"%Summary%"  
echo.>>"%Summary%"  

So nun haut alles wunderbar hin. Danke dir nochmal

Viele Grüße
Tom
Member: bastla
bastla Nov 02, 2007 at 17:42:55 (UTC)
Goto Top
Hallo tkline!

Könntest Du bitte noch Deinen Batch zwischen ""-Tags setzen und dann den How can I mark a post as solved??

Grüße
bastla