2009-06-10 27 views
1

これは私の問題です。
私はメッセージ駆動型Bean Xを持っており、XのonMessage()メソッドでLoggerを利用したいと考えています。私は、アプリケーションサーバーで実行されているBeanのインスタンスが1つしかないと仮定します。したがって、ejbCreate()でlog4jを初期化します。これは私がこのような何かをしなければならないことを意味するでしょう:メッセージ駆動型BeanのLog4j

public void ejbCreate() { 
    PropertyConfigurator.configure(Classloader.getResourceAsStream("xyz_log4j.properties")); 
} 

しかし、これは役に立ちません。私が何をしていても、私のストリームを常にnullにすると、私は他のバージョン、this.getClass()。getStream()とResourceBundleを試しました。

私のプロパティファイルをtest.jarにjarして、それをEARライブラリ(私はRAD7を使用しています)に追加しました。これは私のmanifest.mfに反映されています。

誰もこの問題に直面しましたか?はいの場合、どのように解決しましたか? あなたの助けに感謝...

答えて

1

EJB作成メソッドでlog4jを設定することはお勧めしません。複数のEJBeanは、J2EE仕様に準拠したコンテナでアクティブ化/非アクティブ化できます。したがって、log4jを複数回設定する可能性があります。 1回だけ起動することが保証されている起動Beanの使用を推奨します。

+0

スタートアップBeanとは何ですか?あなたはそれが一度だけ呼び出されることをどのように保証しますか? – Jay

+0

nアプリケーション起動Beanは、アプリケーションの起動時にロードされるセッションBeanです。アプリケーションの起動Beanを使用すると、J2EEアプリケーションでビジネス・ロジックを自動的に実行できるようになります。 – zkarthik

2

あなたは、あなたが不足している、JARファイル内からこれを取得している場合/ iniitial:

Classloader.getResourceAsStream("/xyz_log4j.properties") 

そして、何のディレクトリに応じて、プロパティは、あなたのファイルを含みますそのディレクトリへのパスをクラス階層の最上位に相対して指定する必要があります。たとえば、このプロパティファイルはnet.mine.Programと同じディレクトリにある場合、あなたはこれを行うだろう:

Classloader.getResourceAsStream("/net/mine/xyz_log4j.properties") 

私はあなたがgetResourceAsStream()を使用してMETA-INFディレクトリから読み取ることができるとは思わないが、私は決してきませんおそらくそれを行う方法があります。

1

クラス名をロードにハードコードすることができます。

<name of your class>.class.getResourceAsStream(fileName); 

また、SLF4Jを調べることができます。これはLOG4Jの上に座ることができるファサードです。 APIはほとんど同じです(私が信じているのと同じクリエイター)、SLF4Jは明示的な初期化呼び出しを必要としません。

+0

プロパティファイルがクラスと同じディレクトリにある場合のみ。 – Eddie

+0

あなたは正しいと思いますが、パスを調整する方法があるかもしれません。 –

関連する問題