2017-05-31 10 views
0

当社はちょうどソナーファームを開始しました。コード品質が不思議で、改善したいと思っていました。ソナー違反:条件付きでのみメソッドを呼び出す

私は、このようなロガーの呼び出しを含むコードを持っている:

LOGGER.error(String.format("Cannot load object in status %s (%s)", status, statusDescription), e); 

LOGGER.info(String.format("%s object(s) loaded in status %s (%s)", objects.size(), status, statusDescription)); 

ソナーは、ルールのイカをトリガー:S262、Invokeメソッド(複数可)のみ条件付きで「前提条件」とロギングの引数が評価を要求してはなりません。これらの行の両方によってトリガされるルール。

この1つについては、何が起こっているのか分かりません。説明の縫い目は私のユースケースにあまり合わない。 Sonarのドキュメントでは、この例を提供しています:

logger.log(Level.DEBUG, "Something went wrong: " + message); // Noncompliant; string concatenation performed even when log level too high to show DEBUG messages 

私は完全に理解しています(デバッグは生産には記録されないため、不要な操作が発生します)。しかし、情報とエラーレベルについては、とにかくログに記録したいと思うでしょう。さらに、私の場合、両方を記録したいと思っています。

どちらが良いアプローチですか? String.formatを使用しないで別の書き換えですか?情報/エラーレベルでソナーを起動しないでください。このソナーを無視するだけですか?他に何か?

答えて

3

あなたの連結は、ロガーの条件チェックの前に行われます。したがって、ロガーを10回呼び出して評価がfalseを返すと、あなたの文字列は理由もなく10回連結されます。ロガーは、評価がパスされた後にすべての連結と書式設定を処理し、何かを印刷する必要があります。そうすれば、無駄な操作を省くことができます。

LOGGER.error("Cannot load object in status {} ({})", status, statusDescription, e); 
関連する問題