読者です 読者をやめる 読者になる 読者になる

正規表現で特定の文字列を含まない行、含む行を抽出

先日とある会社のシステムのリリースがありました。

かなり大規模なシステムなので予想通りリリース後
いろいろと問題が発生し、ログ解析する日々です。

ログのフォーマット

2017/03/22 12:00:03 INFO START testAction1.do
2017/03/22 12:00:06 INFO END testAction1.do
2017/03/22 12:00:08 INFO START xxxAction2.do
2017/03/22 12:00:10 FATAL java.lang.NullPointerException
   ・
   ・
   ・
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
   ・
   ・
   ・
2017/03/22 12:03:08 INFO START xxxAction3.do
2017/03/22 12:00:10 WARN xxx.ValidateException
   ・
   ・
   ・
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Javaで構築されたシステムで、予期しない例外が発生するとログに内容が出力されます。

ログから"Exception"を含む行を秀丸エディタgrepして目的の行を検索するのですが、使用しているフレームワークが出力する例外(ValidateException)が大量に出力されて数千件ヒットしてしまいます。

そこで正規表現を使って"Exception"を含む行かつ
"ValidateException"を含まない行を抽出できるようにしました

^(?!.*ValidateException).*(?=Exception).*$

^(?!.*ValidateException).*$で"ValidateException"を含まない行がマッチします。

そこに(?=Exception)を合わせることによって
"ValidateException"を含まない行、
かつ"Exception"を含む行がマッチします。

これで検索結果がかなり絞られましたが、他にもチェック不要な例外(TimeOutException)が
あることが判明

この例外も除外したいので"ValidateException"と"TimeOutException"を含まない行に条件を変更しました

^(?!.*(ValidateException|TimeOutException)).*(?=Exception).*$

除外したい文字列を()で囲んで|で区切るだけです。

これでログ解析の効率がかなりアップしましたよ。