2010-09-28 11 views
9

Pracuję ze starszą aplikacją Java, która nie ma rejestrowania i po prostu drukuje wszystkie informacje na konsoli. Większość wyjątków jest również "obsługiwana" po prostu przez wywołanie funkcji printStackTrace().Wyrażenie regularne służące do analizowania pliku dziennika i odnajdywania ścieżek stacków

W skrócie, właśnie przekierowałem strumienie System.out i System.error do pliku dziennika, a teraz muszę przeanalizować ten plik dziennika. Do tej pory wszystko dobrze, ale mam problemy z próbą parsowania pliku dziennika dla śladów stosu.

Część kodu jest również obscufowana, więc muszę uruchomić stos śledzenia za pomocą aplikacji narzędziowej, aby je usunąć. Próbuję zautomatyzować to wszystko.

Najbliżej Doszedłem tak daleko, aby uzyskać początkową linię za pomocą tego wyjątku:

.+Exception[^\n]+ 

i znalezienie "w .. (..)" linie przy użyciu:

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

Ale nie mogę wymyślić, jak je połączyć, aby uzyskać pełny stos.

Zasadniczo pliki dziennika wyglądają mniej więcej tak: Nie ma ustalonej struktury i przewody przed i po śladów stosu są całkowicie losowe:

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) 

Odpowiedz

8

Wygląda wystarczy wkleić je razem (i korzystać z nowej linii jako kleju):

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

Ale chciałbym zmienić swoją regex trochę:

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

ten łączy w sobie odstępy między linie at... i używa kwantyfikatorów o wartości dzierżawczej, aby uniknąć wycofywania.

+0

To tylko znajdzie pierwszą linię "na", nie wszystkie. –

+0

Czy próbowałeś? Właśnie do tego służy ostateczne '+'. Czy może być coś pomiędzy liniami "at" (czy te "..." są obecne w rzeczywistych plikach logu)? W twoim przykładowym tekście (przynajmniej tak jak tutaj) linie "at" zaczynają się od spacji, a nie od kart. Moje drugie podejście powinno jednak temu zaradzić. –

+0

Niestety, nie widziałem drugiej linii z jakiegoś powodu ... Używanie: ^. + Wyjątek [^ \ n] ++ (\ s + at. ++) + Nie dostaję żadnych dopasowań. .. Co robi ++? Czy to jest tylko skrót dla: (^. + Wyjątek [^ \ n] +) + ((\ s + at.) +) + –

3

Używamy ANTLR do rozwiązania analizowania logów (w innym miejscu aplikacji). To nie jest trywialne, ale jeśli jest to dla ciebie ważne zadanie, to będzie lepsze niż użycie wyrażeń regularnych.

+0

Nie jest to szczególnie ważne, po prostu coś, co robię w wolnym czasie, aby ułatwić nam czytanie plików dziennika, gdy potrzebujemy obsługi klienta. ANTLR wydaje się przesadą. –

+0

@ peter.murray.rust być może masz przykład, jak parsować stacktraces z log wile używając ANTLR? – kuldarim

0

uzyskać dobre wyniki stosując

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

zrzuca się wszystkie linie, które mają wyjątku lub \ TAT w nich. Ponieważ mecz odbywa się w tym samym czasie, zamówienie jest zachowane.

Powiązane problemy