正则表达式解析日志文件并查找堆栈跟踪

我正在使用没有日志记录的旧Java应用程序,只是将所有信息打印到控制台。 通过执行printStackTrace()调用也可以“处理”大多数exception。

简而言之,我只是将System.out和System.error流重定向到日志文件,现在我需要解析该日志文件。 到目前为止一切都很好,但我在尝试解析堆栈跟踪的日志文件时遇到问题。

一些代码也被遮挡了,所以我需要通过实用程序应用程序运行堆栈跟踪来去除它们。 我正在尝试自动完成所有这些。

到目前为止,我最接近的是使用以下方法获取最初的Exception行:

.+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.aahandle(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.aarun(Unknown Source) 

看起来你只需要将它们粘贴在一起(并使用换行符作为粘合剂):

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

但我会改变你的正则表达式:

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

这结合了at...行之间的空白,并使用占有量词来避免回溯。

我们一直在使用ANTLR来解决日志文件的解析(在不同的应用领域)。 这不是微不足道的,但如果这对你来说是一项关键任务,那么它将比使用正则表达式更好。

我用得很好

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

它会转储所有包含Exception或\ tat的行。 由于匹配是在保持订单的同时。