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)
To tylko znajdzie pierwszą linię "na", nie wszystkie. –
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ć. –
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.) +) + –