私はJavaでのオープンソースプロジェクトを管理し、私は次のパターンを使用して例外をログ私のコードでは、約20ヶ所を持っている(SLF4Jバージョン1.7.30)
private static final Logger logger = LoggerFactory.getLogger();
...
try {
interfaces = NetworkInterface.getNetworkInterfaces();
} catch (SocketException ex) {
logger.error("Socket exception when retrieving interfaces: {}", ex);
}
または同様に
try {
// stuff
} catch (IOException ioe) {
logger.error("Server error: {}", ioe);
}
今日から、SonarCloud自動化されたコードの品質レビューがルールでこれらのフラグを立てる始めているjava:S2275
特定のメッセージを持つ(printf形式の文字列は、実行時に予期しない動作につながるべきではありません)「が足りません引数を指定します。」
EDITは:注目すべきは、これは時に一貫起こるように見えるException
最後の引数です。次のパターンは行いませんフラグ:
try {
// Server connection code
} catch (IOException e) {
logger.error("Server Connection error: {}", e.getMessage());
}
レビューこの他のStackOverflowの質問は、私はそれがここに適用すると、なぜそれが突然変更する方法をクリアしていないよので、例外のための余分な引数は省略可能であり、異なる動作になるでしょう、おそらくそれを示しています。
そこに何かが私は/より良いメッセージを記録するためにこれらの例外を(例えば、使用翻訳するためにやるべきことができますされgetMessage()
、それらのすべての代わりに、自動化に頼るのtoString()
解析)、またはこれは偽陽性のですか?
(私の20件の問題のソナーの一覧はこちらをリンクさ。)
これは純粋な推測ですが、として一般化することができるログ行に発行ポイントの各:
LOG.something(format, custom_arguments, exception)
フォーマットた場所{}
に現れるcount(custom_arguments) + 1
(図1は、例外のために予約します)。
あなたが見てきたようにリンクされ、答えを、それが何らかの理由でSonarCloudが同じことをやっている可能性がありますので、例外は、SLF4Jで特別扱います。残念ながらドキュメントはありません。
「修正は」最終取り除くことであろう{}
例えばので、例外のために意図を
LOG.error("boom: {}", e);
LOG.error("boom2 {}: {}", something, e);
となり
// exceptions handled in a special way
LOG.error("boom", e);
LOG.error("boom2 {}", something, e);