Log4jのメッセージ駆動型Beanのために
-
13-09-2019 - |
質問
だから、ここに私の問題があります:
私は、メッセージ駆動型Bean Xを持っており、XのonMessage()メソッドでロガーを利用するようにしたいと思います。私はそれゆえ、私のアプリサーバで実行されている豆の単一のインスタンスを持っていることを推測することができます、私は()のejbCreateでのlog4jを初期化します。これは、私がこのような何かをしなければならない意味します:
public void ejbCreate() {
PropertyConfigurator.configure(Classloader.getResourceAsStream("xyz_log4j.properties"));
}
しかし、これは役立ちません。どんなに私は、私は常にnullとしての私のストリームを取得何をすべきか、私は他のバージョンを試していない:this.getClass()のgetStream()とのResourceBundleを。
私は私の性質がtest.jarするファイルjar'edとEARライブラリの下にこれを追加しました(私はRAD7を使用しています)、それは私のMANIFEST.MFに反映されてしまいました。
誰もが前に、この問題に直面しましたか?そうならば、どのようにそれを解決しましたか? あなたの助けに感謝...
解決
私は、メソッドを作成するEJBでのlog4jの設定をお勧めしません。複数のEJBeansは、容器に不動態化/活性化することができJ2EE仕様ごとに気まぐれ。ですから、log4jの複数回を設定終わる可能性があります。のみ1回呼び出されることが保証されているスタートアップ豆を使用することをお勧めします。
他のヒント
あなたは、あなたがiniitial /
を逃している、JARファイル内からこれを取得している場合:
Classloader.getResourceAsStream("/xyz_log4j.properties")
そして、プロパティファイルが含まれ、どのディレクトリに応じて、あなたは、クラス階層の最上位に対するそのディレクトリへのパスを指定する必要があります。このプロパティファイルはnet.mine.Program
と同じディレクトリにある場合たとえば、あなたはこれを行うだろう。
Classloader.getResourceAsStream("/net/mine/xyz_log4j.properties")
私はあなたがgetResourceAsStream()
を使用してMETA-INFディレクトリから読み取ることができるとは思わないが、私はおそらくそれを行う方法がありますので、試したことがありません。
あなたは負荷にクラス名をハードコーディングしてみてください可能性があります。
<name of your class>.class.getResourceAsStream(fileName);
別の方法としては、 SLF4J のに見てみたいことがあります。どのLOG4Jの上に座ることができるファサードです。 APIはほとんど同じ(私は信じて同じクリエイター)で、SLF4Jは、物事を単純化し解明の初期化コールを必要としないビットます。