1. ホーム
  2. java

Javaでのログ取得と一般的なログ取得。ベストプラクティス?

2023-08-15 12:50:12

質問

時々、自分のロギングコードを見たときに、それが正しく行われているのかどうか疑問に思うことがあります。それに対する明確な答えはないかもしれませんが、私は次のような懸念があります。

ライブラリクラス

いくつかのログを記録するライブラリクラスがあります。 INFO メッセージを記録します。致命的なエラーは例外として報告されます。現在、私はロギング名としてクラス名を持つ私のクラスで静的なロガー・インスタンスを持っています。(Log4jの Logger.getLogger(MyClass.class) )

これは正しい方法でしょうか?このライブラリクラスのユーザは、私の実装からのメッセージを望まないか、アプリケーション固有のログにリダイレクトしたいと思うかもしれません。この場合、ユーザが外部からロガーを設定できるようにする必要がありますか? このような場合、どのように対処するのでしょうか?

一般的なログ

いくつかのアプリケーションでは、私のクラスはクラスの名前によって識別されない特定のログにログメッセージを書きたいかもしれません。(例: HTTP Request log ) そのようなことをするための最良の方法は何でしょうか?ルックアップサービスが思い浮かびます...。

どのように解決するのですか?

あなたの規約はかなり標準的であり、かなり良いものです(imho)。

注意すべきことは、過度の非定義デバッグ呼び出しによるメモリの断片化で、Log4J(および他のほとんどのJavaロギングフレームワーク)で、このようなものに行き着きます。

if (log.isDebugEnabled()) {
  log.debug("...");
}

というのも、(おそらく使っていないであろう)ログメッセージを構築するのは、特に何千回、何百万回と行われる場合は、高くつく可能性があるからです。

INFO レベルのロギングは、あまり "chatty" であるべきではありません (そして、あなたが言うことから、それはそうではないように聞こえます)。INFO メッセージは、アプリケーションの起動や停止のように、一般的に意味があり、重要であるべきです。問題が発生したときに知りたいと思うようなことです。デバッグ/ファインレベルのロギングは、実際に問題を診断しようとするときに、より多く使用されます。デバッグ/ファインレベルのロギングは、通常、必要なときだけオンにします。情報は通常、常にオンになっています。

もし誰かがあなたのクラスから特定のINFOメッセージを望まないならば、 それらはもちろん、それらを得ないようにあなたのlog4j構成を変更する自由があります。Log4jは、この部門で美しくまっすぐです(Java 1.4ロギングと対照的に)。

HTTPのことに関して、私は一般的に、それがJavaロギングで問題であることがわかりませんでした。一見無関係なクラス間で共通のログメッセージが必要な場合 (私の経験ではまれです)、簡単に検索できる何らかのトークンを置きます。