2010-09-28 7 views
9

Ich arbeite mit einer Legacy-Java-App, die keine Protokollierung hat und nur alle Informationen auf die Konsole überträgt. Die meisten Ausnahmen werden auch "behandelt", indem Sie einfach einen printStackTrace() - Aufruf ausführen.Regulärer Ausdruck zum Analysieren einer Protokolldatei und zum Suchen von Stacktraces

Kurz gesagt, ich habe gerade die System.out und System.error Streams in eine Protokolldatei umgeleitet, und jetzt muss ich diese Protokolldatei analysieren. Soweit alles gut, aber ich habe Probleme, die Protokolldatei für Stack-Traces zu analysieren.

Einige der Code ist auch verschleiert, so dass ich die Stacktraces durch eine Utility-App ausführen müssen, um sie zu entschärfen. Ich versuche das alles zu automatisieren.

Der nächstgelegene ich so weit gekommen sind, ist die anfängliche Exception Linie mit diesem zu erhalten:

.+Exception[^\n]+ 

und die Suche nach der "at .. (..)" Linien mit:

(\t+\Qat \E.+\s+)+ 

Aber ich kann nicht herausfinden, wie man sie zusammensetzt, um den vollen StackTrace zu bekommen.

Die Protokolldateien sehen im Prinzip wie folgt aus. Es gibt keine feste Struktur und die Linien vor und nach dem Stack-Traces ist völlig zufällig:

Modem ERROR (AT 
Owner: CoreTalk 
) - TIMEOUT 
IN [] 
Try Open: COM3 


javax.comm.PortInUseException: Port currently owned by CoreTalk 
    at javax.comm.CommPortIdentifier.open(CommPortIdentifier.java:337) 
... 
    at UniPort.modemService.run(modemService.java:103) 
Handling file: C:\Program Files\BackBone Technologies\CoreTalk 2006\InputXML\notify 
java.io.FileNotFoundException: C:\Program Files\BackBone Technologies\CoreTalk 2006\InputXML\notify (The system cannot find the file specified) 
    at java.io.FileInputStream.open(Native Method) 
... 
    at com.gobackbone.Store.a.a.handle(Unknown Source) 
    at com.jniwrapper.win32.io.FileSystemWatcher.fireFileSystemEvent(FileSystemWatcher.java:223) 
... 
    at java.lang.Thread.run(Unknown Source) 
Load Additional Ports 
... Lots of random stuff 
IN [] 

[Fatal Error] .xml:6:114: The entity name must immediately follow the '&' in the entity reference. 
org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference. 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 
... 
    at com.gobackbone.Store.a.a.run(Unknown Source) 

Antwort

8

Sieht aus wie Sie sie einfach zusammen fügen müssen (und eine neue Zeile als Klebstoff verwenden):

.+Exception[^\n]+\n(\t+\Qat \E.+\s+)+ 

Aber ich würde Ihre regex ein wenig ändern:

^.+Exception[^\n]++(\s+at .++)+ 

Dieses Whitespace kombiniert zwischen Die at... Zeilen und verwendet Possessivquantifizierer, um Backtracking zu vermeiden.

+0

Das wird nur die erste "at" -Linie finden, nicht alle von ihnen. –

+0

Haben Sie es versucht? Dafür ist das abschließende '+' gedacht. Oder kann es etwas zwischen den "at" -Zeilen geben (sind diese '...' in den eigentlichen Log-Dateien vorhanden)? In Ihrem Beispieltext (zumindest wie hier angegeben) beginnen die Zeilen "at" mit Leerzeichen, nicht mit Tabs. Meine zweite Regex sollte dies jedoch behandelt haben. –

+0

Sorry, ich sehe die zweite Zeile aus irgendeinem Grund nicht ... Verwendung: ^. + Ausnahme [^ \ n] ++ (\ s + at. ++) + Ich bekomme keine Übereinstimmungen. .. Was macht das ++? Ist das nur Abkürzung für: (^. + Ausnahme [^ \ n] +) + ((\ s + at. +) +) + –

3

Wir haben ANTLR wurden mit der Analyse von Log-Dateien (in einem anderen Anwendungsgebiet) zu bewältigen. Es ist nicht trivial, aber wenn dies eine kritische Aufgabe für Sie ist, wird es besser sein als die Verwendung von Regexes.

+0

Es ist nicht besonders kritisch, nur etwas, was ich in meiner Freizeit mache, um es uns leichter zu machen, die Protokolldateien zu lesen, wenn wir einen Client unterstützen müssen. ANTLR scheint übertrieben zu sein. –

+0

@ peter.murray.rust haben Sie vielleicht ein Beispiel, wie Stacktraces aus Log-Dateien mit ANTLR analysiert werden? – kuldarim

0

ich gute Ergebnisse

perl -n -e 'm/(Exception)|(\tat)/ && print' /var/log/jboss4.2/debian/server.log 

mit Es-Dumps alle Linien, die Ausnahme oder \ tat in ihnen haben. Da die Übereinstimmung in der gleichen Zeit ist, wird die Reihenfolge beibehalten.

Verwandte Themen