2012-04-30 3 views
0

私は、ロガーを使用していたがロガーを起動する前に "is-loggable"テストを実行するのを忘れたかなり大きなプロジェクトを持っています。ログメッセージの連結。ただし、一部のロガーは適切に保護されています。regexpsで保護されていないロガーを検索する

私はこれらの保護されていないロガー呼び出しをすべて検索するためにEclipseで使うことができる正規表現を探していますが、それを行うためのネガティブなlookbehindで適切なregexpを見つけることができません。ここで

が、これは明確にするためにいくつかのサンプルです:

私はこれを一致させたい:

logger.fine("Exception raised: " + 
    e.getClass().getName() + ". See console for details."); 

私はこれと一致したくない:

if (logger.isLoggable(Level.FINE)) { 
    logger.fine("Exception raised: " + 
     e.getClass().getName() + ". See console for details."); 
} 

もこの:

if (logger.isLoggable(Level.FINE)) 
    logger.fine("Exception raised: " + 
     e.getClass().getName() + ". See console for details."); 

私は気にしませんメッセージの内容や、ロガーメソッドコール(severe()、warning()、...)に続くものを照合するには、logger.fine部分が必要です。

これまで私はこの正規表現を使用しました: ((?<!if\s?.?logger\.isLoggable.?Level.{0,20})logger.(severe|warning|info|fine|finer|finest))しかし、私は一致したくないものにマッチします。これがどのように修正されるかに関する考え方は?

コードは書式設定されています(インデントはタブで行われます)。これは、私たちの期待にかなり厳しくなる可能性があることを意味します。

+0

誰もlogger.warning' '周りにチェックを入れません。コードに実際にパフォーマンスが心配しているような警告ログがたくさんある場合は、再考する必要があります。 – adarshr

+0

@adarshr警告のために十分な公正ですが、私はそれらの細かい、細かくそして最高の方法にもっと興味があります。このプロジェクトは500,000以上の回線があるため、相当なものになる可能性があります。 –

+0

正規表現がもはや正しいツールではない複雑さのポイントを渡したと思います。 http://code.google.com/p/javaparser/wiki/UsingThisParserのようなjavaパーサーをお勧めします。数行のコードで、これはコードベースのlogger.warning()/ fine()/ ...の呼び出しをすべて訪れ、適切な 'if'ブロック内にあるかどうかをチェックします。お役に立てれば。 – laher

答えて

1

は、この試してみて:

(?<!if\s?\(logger\.isLoggable[^\n]{0,20}\n\s{0,20})logger\.fine 

説明:

(?<!   # open negative lookbehind 
if\s?\(logger\.isLoggable # look for your if statement 
[^\n]{0,20} # then gobble up a bunch of characters ... 
\n   # ... up to the end of the line 
\s{0,20}  # optional whitespace at the beginning of the next line 
)   # close the look behind 
logger\.fine # now, is logger.fine there? 
+0

*や+のようなワイルドカードは、ルックバックの内側には使用できません。しかし、私たちは使うことができますか?と{}。私は最初の*を?に置き換えるとうまくいくようです。 {0,20}を持つ次のもの(20文字を超えることはありません。また、ログ可能な呼び出しの行には20個以上のタブがありません。)回答を更新して受け入れます。 –

+0

興味深い* +ワイルドカードはPCREのlookbehindsで動作しますので、Eclipseではうまくいかず、テストする方法がありません。答えを変更しました。 – alan

+0

私は、EclipseがPerlに近いJava組み込みのregexpエンジンを使用していると確信しています。とにかく正規表現のためにありがとう、それはうまく動作します。 –

関連する問題