2012-01-24 66 views
2

我正在嘗試爲log4j編寫一個日誌解析器。我有一個適用於正常消息的正則表達式,但是當它到達引發異常的消息時,它只會顯示第一行的內容,並且不會與堆棧跟蹤相匹配。正則表達式,可以處理Java異常

我該如何編寫一個可以處理跨越多行的Java異常的正則表達式?

這是當前正則表達式,我在Java中使用:

^(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.+)$ 

這是一個正常的日誌信息:

2012-01-25 20:10:03,480 INFO org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler: nodeUpdate: example.com:1 clusterResources: memory: 1 

下面是一個例子異常日誌消息:

2012-01-25 00:03:59,565 ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint 
java.io.IOException: Inconsistent checkpoint fields. 
LV = -1 namespaceID = 1 cTime = 0 ; clusterId = CID-1 ; blockpoolId = BP- 
Expecting respectively: -1; 1; 0; CID-1; BP-1 
     at org.apache.hadoop.hdfs.server.namenode.CheckpointSignature.validateStorageInfo(CheckpointSignature.java:111) 
     at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.doCheckpoint(SecondaryNameNode.java:510) 
     at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.doWork(SecondaryNameNode.java:381) 
     at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode$2.run(SecondaryNameNode.java:344) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:337) 
     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1149) 
     at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.run(SecondaryNameNode.java:341) 
     at java.lang.Thread.run(Thread.java:619) 
+6

你能舉一個你想匹配的Java異常的例子嗎?所以我們正規的民間人誰也不是java/log4j民間可以幫你嗎? :)我唯一可以做的建議是查看'DOTALL'正則表達式標誌(通常是''),它使'.'匹配所有字符,包括'\ n'和'MULTILINE'正則表達式標誌(通常是'm' ),它讓'^'和'$'匹配行的開始/結束以及字符串的開始/結束。 –

回答

2

這應該這樣做:

(.*\\bERROR\\b.*)\\r?\\n(.*\\r?\\n)*(.*\\bat\\b.*)*(\\d{1,4}\\)\\r?\\n) 

我假設您正在將日誌文件讀入CharSequence,並將其傳遞給Java中的模式匹配器,而不是逐行讀取文件。