Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解析日志文件并查找堆栈跟踪的正则表达式_Java_Regex - Fatal编程技术网

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

Java 解析日志文件并查找堆栈跟踪的正则表达式,java,regex,Java,Regex,我使用的是一个遗留Java应用程序,它没有日志记录,只是将所有信息打印到控制台。大多数异常也可以通过执行printStackTrace()调用来“处理” 简而言之,我刚刚将System.out和System.error流重定向到一个日志文件,现在我需要解析该日志文件。到目前为止一切正常,但我在尝试解析日志文件以查找堆栈跟踪时遇到问题 一些代码也被阻塞了,所以我需要通过一个实用程序运行stacktraces来消除阻塞。我正在尝试将所有这些自动化 到目前为止,我最接近的方法是使用以下命令获取初始异常

我使用的是一个遗留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