2012-01-24 13 views
2

私はlog4jのログパーサーを作成しようとしています。私は通常のメッセージで動作する正規表現を持っていますが、例外をスローするメッセージになると、最初の行に何が表示され、スタックトレースと一致しません。Java例外を処理できる正規表現

複数行にわたるJava例外を処理できる正規表現を作成するにはどうすればよいですか?ここで

は、私はJavaで使用しています現在の正規表現である:ここでは

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

は、通常のログMSGである:ここで

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

は、例えば、例外ログMSGです:

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フォークもあなたを助けることができない正規表現フォーク? :)私が作ることができる唯一の推奨事項は、 '\ n 'を含むすべての文字と' MULTILINE '正規表現フラグ(しばしば' m ')をマッチさせる' DOTALL '正規表現フラグ)これは、 '^'と '$'が行の開始/終わり、および文字列の開始/終了と一致するようにします。 –

答えて

2

これを行う必要があります:

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

ログファイルをCharSequenceに読み込んで、ファイルを行単位で読み込むのではなく、Javaのパターンマッチャーに渡すことを前提にしています。