регулярное выражение, которое может обрабатывать исключения Java - PullRequest
2 голосов
/ 25 января 2012

Я пытаюсь написать анализатор журнала для log4j.У меня есть регулярное выражение, которое работает для обычных сообщений, но когда оно попадает в сообщение, которое выдает исключение, оно будет отображать только то, что находится в первой строке, и не будет соответствовать трассировке стека.

Как написать регулярное выражение, которое может обрабатывать исключения 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)

1 Ответ

2 голосов
/ 27 января 2012

Это должно сделать это:

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

Я предполагаю, что вы читаете файл журнала в CharSequence и передаете его в сопоставитель шаблонов в Java вместо чтения файла построчно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...