2012-03-01 7 views
3

私はロギングファサードとしてSLF4Jを使用しており、ユーザーはどこでログをとるのかを決めることができます。クラッシュが発生した場合、デバッグ情報を含むファイルをサーバに送信します。これは基本的にログファイルを意味します。そして、私たちはすでにコードに散らばっているすべてのログステートメントを持っているので、それらを使わないのはなぜですか?slf4jロギングを受信する方法と、バックエンドのロギングに依存しない方法はありますか?

だから基本的に、私はまだ彼自身のロギングバックエンドや構成にプラグインすることができ、ユーザのための透明SLF4Jを経由して、プログラムでログファイルを、作成したいです。

私の最初のアイデアは、ユーザが設定したロガーへのロギングと、その後デリゲートを行い、ロガーの私の独自の実装を提供し、org.slf4j.impl.StaticLoggerBinderを実装することでした。しかし、私はこれに関するいくつかの問題を見ています。ユーザーが通常のロギングバックエンドを置く場合、org.slf4j.impl.StaticLoggerBinderの複数のインスタンスがクラスパス上にあります。これにより警告が表示され、私の実装が呼び出されることを確認することができない場合があります。

がこれまでより良い解決策はありますか?全く異なるアプローチ?アイデアは本質的に悪いですか?これを達成する方法は?

答えて

2

SLF4Jはオープンソースですので、あなたはorg.slf4j.impl.StaticLoggerBinderよりも別のクラスを使用するように変更することができます。次に、カスタムのStaticLoggerBinderクラスが元のユーザー提供のorg.slf4j.impl.StaticLoggerBinder(存在する場合)を読み込むことができます。

もう1つのアイデアは、お客様のアプリケーションでLoggerFactoryorg.slf4j.LoggerFactoryではなく)というカスタムを使用して、Loggerデリゲートを返します。このデリゲートクラスは、メソッド呼び出しを元のLogger実装に委譲し、必要に応じてログをサーバーに送信します。

いずれにしても、どちらも私にとっては厄介なハックに見えますが、2つのアーティファクト(エンドユーザー用と開発者用)がうまくいきます。

(最後に、それはどのようなライブラリ/アプリケーションかわかりませんが、私の作業環境では、ライブラリがサードパーティのサーバにデータを送信する場合には受け入れられません。これを行うには?)

3

SLF4Jのポイントは、アプリケーションのエンドユーザーが自分のロギングフレームワークを選択できるように(なぜ彼らは気にしますか?)が、ロギングフレームワークのライブラリーの選択に縛られることなく、開発者がライブラリを含めるようにするではありません。

あなたが展開されたアプリケーションからのデバッグ情報をアップロードしたいのであれば、それはロギング実装を修正するために罰金です。ユーザーは、実装の設定ファイルを必要に応じて編集することができます。

+0

私はあなたの最初の点に完全に同意します。しかし、このアプリケーションは、エンドユーザー用と、開発者向けのAPIを他のアプリケーションに含めるための2つの方法で使用できます。 APIとして使用されても、私はまだアプリのログのコピーを持っていたいと思いますし、この機能のために2つの異なるバージョンを使用しないようにしたいと思います。 – roesslerj

+0

@roesslerjこれは質問自体に編集したいと思うかもしれない詳細です。 –

関連する問題