7 Stimmen

Analysieren einer mehrzeiligen Protokolldatei mit variabler Länge

Ich möchte eine "grep"- oder "pcregrep -M"-ähnliche Lösung verwenden können, die eine Protokolldatei analysiert, die den folgenden Parametern entspricht:

  • Jeder Protokolleintrag kann mehrere Zeilen lang sein
  • Die erste Zeile des Protokolleintrags enthält den Schlüssel, nach dem ich suchen möchte
  • Jede Taste erscheint auf mehr als einer Zeile

Im folgenden Beispiel würde ich also jede Zeile mit KEY1 und alle darunter liegenden Zeilen bis zur nächsten Protokollmeldung zurückgeben wollen.

Log file:
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext
        blah
        blah2 T
        blah3 T
        blah4 F
        blah5 F
        blah6
        blah7
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse
01 Feb 2010 - 10:39:01.758, DEBUG - KEY2:randomtest
this is a test
01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here
this is another multiline log entry
keeps on going
but not as long as before
01 Feb 2010 - 10:39:01.763, DEBUG - KEY2:testing
test test test
end of key2
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
okay enough
01 Feb 2010 - 10:39:01.762, DEBUG - KEY3:and so on
and on
    Desired output of searching for KEY1:
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext
        blah
        blah2 T
        blah3 T
        blah4 F
        blah5 F
        blah6
        blah7
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse

01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here
this is another multiline log entry
keeps on going
but not as long as before
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
okay enough

Ich habe versucht, etwas zu tun wie:
pcregrep -M 'KEY1(.* \n )+' Logdatei
aber es funktioniert definitiv nicht richtig.

10voto

ghostdog74 Punkte 305138

Wenn Sie unter *nix arbeiten, können Sie die Shell

#!/bin/bash
read -p "Enter key: " key
awk -vkey="$key" '
$0~/DEBUG/ && $0 !~key{f=0}
$0~key{ f=1 }
f{print} ' file

Ausgabe

$ cat file
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext
        blah                                       
        blah2 T                                    
        blah3 T                                    
        blah4 F                                    
        blah5 F                                    
        blah6                                      
        blah7                                      
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse
01 Feb 2010 - 10:39:01.758, DEBUG - KEY2:randomtest  
this is a test                                       
01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here 
this is another multiline log entry                    
keeps on going                                         
but not as long as before                              
01 Feb 2010 - 10:39:01.763, DEBUG - KEY2:testing       
test test test                                         
end of key2                                            
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going
and going
and going
okay enough
01 Feb 2010 - 10:39:01.762, DEBUG - KEY3:and so on
and on

$ ./shell.sh
Enter key: KEY1
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext
        blah
        blah2 T
        blah3 T
        blah4 F
        blah5 F
        blah6
        blah7
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse
01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here
this is another multiline log entry
keeps on going
but not as long as before
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
okay enough

0voto

Johannes Punkte 2922

Ich hatte eine ähnliche Anforderung und beschloss, ein kleines Tool (in .net) zu programmieren, das Protokolldateien für mich parst und das Ergebnis in die Standardausgabe schreibt.

Vielleicht finden Sie es nützlich. Funktioniert unter Windows und Linux (Mono)

Siehe hier: https://github.com/iohn2000/ParLog

Ein Werkzeug zum Filtern von Protokolldateien nach Protokolleinträgen, die ein bestimmtes (Regex-)Muster enthalten. Funktioniert auch mit mehrzeiligen Protokolleinträgen. z.B.: nur Protokolleinträge von einer bestimmten Workflow-Instanz anzeigen. Das Ergebnis wird auf die Standardausgabe geschrieben. Verwenden Sie '>', um in eine Datei umzuleiten

standardmäßig ist startPattern :

^[0-9]{2} [\w]{3} [0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}

dies entspricht dem Datumsformat: z.B.: 04 Feb 2017 15:02:50,778

Die Parameter sind:

f:wildcard      a file name or wildcard for multiple files
p:pattern       the regex pattern to filter the file(s)
s:startPattern  regex pattern to define when a new log entry starts

Beispiel:

ParLog.exe -f=*.log -p=findMe

-1voto

Urgo Punkte 77

Ergänzend zur Antwort von ghostdog74 (vielen Dank, es funktioniert großartig)

Nimmt jetzt Kommandozeileneingaben in Form von "./parse file key" entgegen und verarbeitet die Loglevels ERROR und DEBUG

#!/bin/bash
awk -vkey="$2" '
$0~/DEBUG|ERROR/ && $0 !~key{f=0}
$0~key{ f=1 }
f{print} ' $1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X