1

LoggerのJavaドキュメントには、ロガー名はクラス名に基づく必要があることが示されています。Google GuiceはこれをBinderImpl.javaで処理し、次のことを行います。

return member == null
      ? Logger.getAnonymousLogger()
      : Logger.getLogger(member.getDeclaringClass().getName());

ただし、クラスごとに新しいロガーを取得しているため、ロガーに追加されたハンドラーにアクセスできなくなります。

ロガー内でクラス名を使用することと、ハンドラーの標準セットを適用することの両方を処理するための最良の方法は何ですか?

4

1 に答える 1

4

このソリューションは、実際にはGuiceとは関係ありませんが、Javaでのロギングクラスの動作に基づいています。

ロガーは階層で作成されるため、ロガーx.y.zはの子であり、名前がx.yの文字列であるルートロガーまでのチェーンのずっと上にあります。各ロガーは、ログレベルなどのプロパティを親から継承します。

したがって、ログレベルをグローバルに設定する(またはハンドラーをグローバルに設定する)には、ルートロガーでログレベルを設定するだけです。

LogManager logManager = LogManager.getLogManager();
Logger rootLogger = logManager.getLogger("");
rootLogger.setLevel(Level.FINEST);
rootLogger.addHandler(new ConsoleHandler());

それが完了すると、注入されたロガーは、ルートロガーと存在する可能性のある親ロガーから派生したプロパティを持ちます。基本の詳細については、LogManagerのドキュメントを参照してください。

configプロパティも存在します。LogManagerのドキュメントによると:

プロパティ「config」。このプロパティは、任意の構成コードを実行できるようにすることを目的としています。このプロパティは、クラス名の空白またはコンマ区切りのリストを定義します。名前付きクラスごとに新しいインスタンスが作成されます。各クラスのデフォルトコンストラクターは、ロガーレベルの設定、ハンドラーの追加、フィルターの追加など、ロギング構成を更新するために任意のコードを実行する場合があります。

これは、構成クラスを使用することもできたため、問題には複数の解決策があることを意味します。

于 2010-01-15T15:24:47.630 に答える