Java 解析日志文件并查找堆栈跟踪的正则表达式
我使用的是一个遗留Java应用程序,它没有日志记录,只是将所有信息打印到控制台。大多数异常也可以通过执行printStackTrace()调用来“处理” 简而言之,我刚刚将System.out和System.error流重定向到一个日志文件,现在我需要解析该日志文件。到目前为止一切正常,但我在尝试解析日志文件以查找堆栈跟踪时遇到问题 一些代码也被阻塞了,所以我需要通过一个实用程序运行stacktraces来消除阻塞。我正在尝试将所有这些自动化 到目前为止,我最接近的方法是使用以下命令获取初始异常行:Java 解析日志文件并查找堆栈跟踪的正则表达式,java,regex,Java,Regex,我使用的是一个遗留Java应用程序,它没有日志记录,只是将所有信息打印到控制台。大多数异常也可以通过执行printStackTrace()调用来“处理” 简而言之,我刚刚将System.out和System.error流重定向到一个日志文件,现在我需要解析该日志文件。到目前为止一切正常,但我在尝试解析日志文件以查找堆栈跟踪时遇到问题 一些代码也被阻塞了,所以我需要通过一个实用程序运行stacktraces来消除阻塞。我正在尝试将所有这些自动化 到目前为止,我最接近的方法是使用以下命令获取初始异常
.+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)
我们一直在使用ANTLR来处理日志文件的解析(在不同的应用领域)。这不是一件小事,但如果这对您来说是一项关键任务,它将比使用正则表达式更好。看起来您只需要将它们粘贴在一起(并使用换行符作为粘合剂): 但我会改变一下你的正则表达式:
^.+Exception[^\n]++(\s+at .++)+
这将在…行中组合
之间的空格,并使用所有格量词来避免回溯。我使用
perl -n -e 'm/(Exception)|(\tat )/ && print' /var/log/jboss4.2/debian/server.log
它转储所有包含异常或\t的行。因为匹配是在同一时间进行的,所以顺序保持不变。这只会找到第一个“at”行,而不是所有的。您试过了吗?这就是最后的+
的目的。或者在“at”行之间可能有什么东西(这些…
是否存在于实际日志文件中)?此外,在您的示例文本中(至少如本文所示),“at”行以空格开头,而不是以制表符开头。不过,我的第二个正则表达式应该已经处理好了。对不起,由于某种原因,我没有看到第二行。。。使用:^.+Exception[^\n]++(\s+at.++)++我没有得到任何匹配项。。。++做什么?这仅仅是:(^.+Exception[^\n]+)+((\s+at.+)+)+的简写吗实际上,请注意。。。我对此有点困惑,但删除前导^。异常行肯定位于行的开头,但是没有它就可以工作…@AhmedAkhtar:Regexr的regex引擎不支持所有格量词。使用regex101.com进行测试,效果更好。它不是特别重要,只是我在空闲时间做的一些事情,以便在需要支持客户端时更容易读取日志文件。ANTLR似乎有些过分。@peter.murray.rust也许你有一个例子,如何使用ANTLR从log wile解析stacktraces?
perl -n -e 'm/(Exception)|(\tat )/ && print' /var/log/jboss4.2/debian/server.log