5

プロジェクトのセットアップ:

  1. Logging-1.0.jar
    • slf4j/log4j を使用する Logger.class が含まれています
    • slf4j-api.jar、slf4j-log4j.jar、log4j.jar に依存
  2. LoggingOSGI-1.0.jar
    • ロギング プロジェクトをラップします
    • Activator と MANIFEST.MF が含まれています
    • lib/ には logging-1.0.jar、slf4j-api.jar、slf4j-log4j.jar、log4j.jar が含まれています
    • lib/ の jar がクラスパスに追加され、logging-1.0.jar のパッケージがエクスポートされます
  3. SomeBundle-1.2.jar
    • Activator と MANIFEST.MF が含まれています
    • LoggingOSGI-1.0.jar に依存しています

SomeBundle から Logger クラスへのアクセスは機能しますが、ロギング プロジェクトは log4j.properties を見つけることができません (log4j:WARN ロガーのアペンダーが見つかりませんでした)。

質問:

  • log4j.properties はどこに置く必要がありますか?
  • 私が試すことができるアイデアはありますか?(すでに試しました:VM引数として異なるディレクトリ、Eclipse-Buddies、-Dlog4j.configuration)
  • ロギング プロジェクトに log4j.properties の場所を伝える拡張ポイントでしょうか。これは良い解決策でしょうか?
4

2 に答える 2

7

約 6 年前にこれを最後に試したとき、解決策はlog4j.propertiesファイルでフラグメント バンドルを作成し、そのフラグメントを (マニフェスト ヘッダーを介して) ロギング ライブラリをロードするバンドルに添付することでした ("Logging -1.0.jar"、あなたの場合)。このような単純な目標のように見えるものに対して、多くのプロジェクト構造、ビルド時間、および展開のオーバーヘッドのように感じました。Fragment-Host

フラグメント バンドルの詳細については、 OSGi サービス プラットフォーム コア仕様のセクション 3.14 を参照してください。

もう 1 つのアイデアは、構成管理サービスを使用して、バンドルの外部にあるディスク上のログ構成ファイルへのパスを指定することを検討することです。そのためには、ログ ライブラリを拡張して構成を検索し (または、リッスンすることをお勧めします)、その構成をログ実装に渡す必要があります。

また、 OSGi Service Platform Service Compendiumのセクション 101 で指定されている OSGi Log Service についても言及していません。

于 2012-08-24T13:25:56.383 に答える
1

私の問題を解決するために、log4j を構成する LoggingOSGI-1.0 のアクティベーターにこのコードを追加しました。ファイル パスは、システム プロパティから取得されます: -Dlog4j.configuration=path/to/log4j.properties.

このソリューションに対する他のアプローチや意見にまだ興味があります。

private static final String LOG4J_CONFIG_KEY = "log4j.configuration";

public void start(BundleContext bundleContext) throws Exception {
    Activator.context = bundleContext;

    if (System.getProperties().containsKey(LOG4J_CONFIG_KEY)) {
        String file = System.getProperties().getProperty(LOG4J_CONFIG_KEY);
        PropertyConfigurator.configure(file);
    }
}
于 2012-08-24T13:29:35.813 に答える