2

次のTomcatログ構造を検討してください。

[06/Feb/2013:15:25:27 +0000] [Thread-10] DEBUG xxx.yyy.xxx.yyy.xxx.yyy.BlahBlahClass  - Reloading blah configuration: /somepath/xxx.yyy
[06/Feb/2013:15:25:27 +0000] [Thread-11] ERROR xxx.yyy.xxx.yyy.xxx.yyy.BlahBlahClass2  - [xxx.yyy] - Could not find the somethinh
[06/Feb/2013:15:25:27 +0000] [Thread-12] ERROR xxx.yyy.xxx.yyy.xxx.yyy  - error handling product : xxx.yyy  don't know where it is 
xxx.yyy.IOException: Could not find the feed with id [thisisfeedname_13601429613239870] in the feed repository or as a what?
    at xxx.yyy.xxx.yyy.xxx.yyy.xxx.yyy(xxx.yyy:57)
    at xxx.yyy.xxx.yyy.xxx.yyy.xxx.yyy(xxx.yyy:65)
    at xxx.yyy.xxx.yyy.xxx.yyy.flush(xxx.yyy:294)
    at xxx.yyy.xxx.yyy.DelayedLogger$xxx.yyy(Unknown Source)
Caused by: xxx.yyy.FileNotFoundException: /path/to/feeds/xxx.yyy (No such file or directory)
    at xxx.yyy.xxx.yyy(Native Method)
    at xxx.yyy.FileInputStream.<init>(xxx.yyy:120)
    at xxx.yyy.xxx.yyy.xxx.yyy.parse(xxx.yyy:248)
    at xxx.yyy.xxx.yyy$xxx.yyy(Unknown Source)
    at xxx.yyy.xxx.yyy.xxx.yyy.xxx.yyy(xxx.yyy:41)
    at xxx.yyy.xxx.yyy.xxx.yyy.xxx.yyy(xxx.yyy:13)
    at xxx.yyy.xxx.yyy.xxx.yyy.xxx.yyy(xxx.yyy:54)
    at xxx.yyy.xxx.yyy.xxx.yyy(xxx.yyy:176)
    at xxx.yyy.xxx.yyy.xxx.yyy(xxx.yyy:151)
    at xxx.yyy.xxx.yyy.xxx.yyy(xxx.yyy:143)
    at xxx.yyy.xxx.yyy.xxx.yyy(xxx.yyy:127)
    at xxx.yyy.xxx.yyy.xxx.yyy.xxx.yyy(xxx.yyy:63)
    at xxx.yyy.xxx.yyy.xxx.yyy.xxx.yyy(xxx.yyy:43)
    ... 3 more
[06/Feb/2013:15:25:27 +0000] [Thread-13] INFO  xxx.yyy.xxx.yyy.xxx.yyy  - constructing a new CSV feed resource
[06/Feb/2013:15:25:27 +0000] [Thread-14] DEBUG xxx.yyy.xxx.yyy.xxx.yyy.xxx.yyy  - number of feeds defined for the resource: 1
[06/Feb/2013:15:25:27 +0000] [Thread-15] INFO  xxx.yyy.xxx.yyy.xxx.yyy  - constructing a new CSV feed resource

ログは、中かっこで囲まれたタイムスタンプで始まり、オプションでスタックトレースが続くレポート行で構成されます。たとえばThread-12、次のスタックトレースがありますが、スレッド10〜15にはありません。

ERROR各ログイベントを、タイムスタンプ、エラータイプ(など) 、INFOメッセージ、およびオプションのスタックトレースを含むPythonオブジェクトに変換したいと思います。次の正規表現を試しました。

reg_str='^\[(.*?)\]\s+\[(.*?)\]\s+(\w+)\s*(.*)\s*$\s*(([^\[].*?$)*)'
reg=re.compile(reg_str, re.MULTILINE)

残念ながら、スタックトレースがある場合は常に、正規表現はログの最後までテキストと貪欲に一致します。

ログイベントに正しく一致するように正規表現を書き直すにはどうすればよいですか?

4

1 に答える 1

2

まず、欲張り部分を非欲張りにします;)

^\[(.*?)\]\s+\[(.*?)\]\s+(\w+)\s*(.*?)\s*$\s*(([^\[].*?$)*)
                                    ^

これがRubularリンクです。

ただし、リンクで、残りの正規表現に問題があることがわかります。オプションの行はインデントできるため、最初に行う必要があるのは、最後\s* を括弧で囲むことです。次に、否定された文字クラスの代わりに否定的な先読みを使用する必要があります。これは、この回答の説明が複雑になる可能性があるためです(ただし、必要に応じて、コメントで説明できます)。そのようです:

^\[(.*?)\]\s+\[(.*?)\]\s+(\w+)\s*(.*?)\s*$((\s*(?!\[).*?$)*)
                                          ^^^^^^^^^^^

これが別のRubularリンクです。

最後に、その最後のキャプチャグループは特に有用ではないので...

^\[(.*?)\]\s+\[(.*?)\]\s+(\w+)\s*(.*?)\s*$((?:\s*(?!\[).*?$)*)
                                            ^^

これが最後のRubularリンクです。

于 2013-02-06T17:41:54.270 に答える