0

元のタイトル:Apache LogFactoryに常に同じログ実装を返すようにするにはどうすればよいですか?

さまざまな場所に移動するように構成された、かなりの数のさまざまなロガーを使用するプロジェクトがあります。単体テストを実行しているときに、自分でインスタンス化するSimpleLoggerでそれらすべてをオーバーライドしたいと思います。これをLogFactoryに設定して、単体テストで常に返されるようにするにはどうすればよいですか?

私は実際には外部構成ファイルを扱いたくありません。

少し背景として、私はロガーが信頼できないことで悪名高いと思います。実際にはロガーではありません。ロガーを構成して出力をフィルタリングする方法はたくさんあります。さまざまな構成ファイルから、またはコード内のどこからでも実行でき、さまざまな場所に送信できます。ロガーは、構成に基づいて、ある種の出力(エラー)を他の場所とは異なる場所に送信することもできます。

これは非常に素晴らしく強力ですが、実際に呼び出されているのに出力がリダイレクトされているのに、なぜコードが呼び出されないのか疑問に思う6時間かかると、すべて元に戻されます。

テストを実行するときは、すべての出力が表示されていることをできるだけ確認したいので、すべてのログをコンソールにリダイレクトします。(すべて、私の現在のプロジェクトのように、6つのディレクトリにまたがる数十の異なるログファイルを作成できます。)

4

1 に答える 1

1

私はついにこれを行う方法を見つけました。

独自のファクトリで LogFactory を拡張できます。両方の getInstance メソッドをオーバーライドして、ロガーを返します (明らかに、他のすべてのメソッドは空にすることができます)。SimpleLogger を使用して、すべてのロギングをコンソールに振り分けました。

public Log getInstance(文字列名) が LogConfigurationException をスローします {
    // これが単なるテスト用でなければ、代わりにこれらのロガーのマップを保持します...
    SimpleLog consoleLogger=新しい SimpleLog(名前);
    consoleLogger.setLevel(SimpleLog.LOG_LEVEL_ALL);
    consoleLogger を返します。
}
public Log getInstance(Class className) が LogConfigurationException をスローします {
    return getInstance(arg0.getName());
}

次に、このクラス内の静的メソッドを使用してインストールします。

public static void initialize() {
    System.setProperty(LogFactory.FACTORY_PROPERTY, MyLogFactory.class.getName());
}

これにより、ログの再ルーティング全体が 1 つのクラスに限定されます。テストの開始時に initialize() を呼び出すと、セッションのすべてのログ出力がコンソールに再ルーティングされます。後で呼び出さないでください。そうしないと、テストしているコードが既に「通常の」ファクトリを呼び出して、実際のロガーをキャッシュしている可能性があります。

于 2012-12-07T17:04:54.617 に答える