Регулярное выражение для разбора файла журнала и поиска трассировки стека - PullRequest
9 голосов
/ 28 сентября 2010

Я работаю с унаследованным Java-приложением, которое не ведет журналы и просто выводит всю информацию на консоль. Большинство исключений также «обрабатываются» простым вызовом printStackTrace ().

Вкратце, я только что перенаправил потоки System.out и System.error в файл журнала, и теперь мне нужно проанализировать этот файл журнала. Пока все хорошо, но у меня возникают проблемы при попытке разобрать файл журнала на наличие следов стека.

Часть кода также омрачена, поэтому мне нужно запустить трассировку стека через служебное приложение, чтобы удалить их. Я пытаюсь автоматизировать все это.

Самое близкое, к чему я пришел, - это получить начальную строку исключения, используя это:

.+Exception[^\n]+

И найти строки "at .. (..)", используя:

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

Но я не могу понять, как собрать их вместе, чтобы получить полную трассировку стека.

По сути, файлы журналов выглядят примерно так: Не существует фиксированной структуры, и линии до и после трассировки стека абсолютно случайны:

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)

Ответы [ 3 ]

8 голосов
/ 28 сентября 2010

Похоже, вам просто нужно вставить их вместе (и использовать новую строку в качестве клея):

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

Но я бы немного изменил ваше регулярное выражение:

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

Это объединяетпробел между строками at... и использует собственнические квантификаторы, чтобы избежать возврата назад.

3 голосов
/ 28 сентября 2010

Мы использовали ANTLR для анализа файлов журналов (в другой области приложения).Это не тривиально, но если это критически важная задача для вас, это будет лучше, чем использование регулярных выражений.

0 голосов
/ 28 сентября 2010

Я получаю хорошие результаты, используя

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

. Он сбрасывает все строки, в которых есть исключения или \ tat.Поскольку совпадение происходит одновременно, порядок сохраняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...