Eclipse / OSGiプラグインへのログイン
質問
Eclipseプラグイン(技術的にはOSGiプラグイン)の開発を始めていますが、最初に遭遇した問題の1つは、通常のようにcommons-logging出力を制御できないように見えることです。
プラグインの依存関係にcommons-loggingパッケージを含めました。実際、何か(INFO以上の重大度)を記録すると、コンソールに記録されます。ただし、低レベル(DEBUGやTRACEなど)でログを記録することはできません。
log4j.propertiesファイルを指定しましたが、それはクラスパスにあります(ランタイムの場合、commons-loggingパッケージと同じです)が、そのプロパティファイルの設定はロガーの動作に影響しません。 。
log4j.propertiesファイルは次のとおりです。
# Log4j Logging levels, in order of decreasing importance are:
# FATAL, ERROR, WARN, INFO, DEBUG, TRACE
#
# Root logger option
log4j.rootLogger=ERROR,stdout
#,LOGFILE
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %r (%l) %t%n - %m%n
ロガーの出力を実際に制御するには、何をする必要がありますか?
フォーマットがjava.util.loggingのデフォルトと一致するか、誰かに他のヒントを提供することを期待して、いくつかのサンプル出力メッセージを以下に示します。
Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start
SEVERE: fatal_message
Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start
WARNING: warn_message
Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start
INFO: info_message
更新:
今、次のさまざまな組み合わせを試しました:
- org.osgi.service.log.LogService et al。
- slf4j
- Log4J
- Commons-logging
- java.util。ロギング
そして、私はプロンプトからOSGiを手動で実行している場合、DEBUGまたはそれより低いレベルのメッセージをのみ取得できます(これは私が開発しているものにとっては実用的ではありません)。さらに、さまざまなプロパティファイルを介して他の種類のログ構成を変更することはできません。その点で私が試みることはすべて、日食の設定によって上書きされるようです。
また、上記のライブラリのさまざまな構成ファイルを、提案されているようにそれぞれのライブラリに添付されたプラグインフラグメントとしてなど、さまざまな場所に置いてみましたこちら、それでも同じ結果が発生します。
カスタムLogListenerを実装し、System.out.printlnを使用してログメッセージのパス全体(とにかく方法を知っています)をトレースし、デバッグメッセージが 存在する私が使用している基本的なロギングAPIによって出力されるまで、それらは消えます。
解決
3日後...
問題が見つかりました!最初に、1つのMANIFEST.MFファイルに問題がありました。2つのことを行う必要がありました。
1つのバンドルのMANIFEST.MFに次のものがありました:
Bundle-ClassPath: lib/jena.jar,
.,
org.apache.log4j-1.2.12.jar,
lib/google-collect-snapshot.jar
Import-Package: com.acme.client.translation,
com.acme.translation.interfaces,
com.acme.shared.osgi,
com.acme.utilities
それはすべきでした:
Bundle-ClassPath: lib/jena.jar,
.,
lib/google-collect-snapshot.jar
Import-Package: com.acme.client.translation,
com.acme.client.translation.interfaces,
com.acme.shared.osgi,
com.acme.utilities,
org.apache.log4j
重要な違いは、log4jがバンドルとして使用されるべきだったときに、パッケージとして使用されていたことです。 (Log4jがOSGiで「正常に動作する」ことを期待していたときから、libディレクトリーにlog4j jarがありました。)jarは、 does 動作します。明らかに、Eclipseレベルのlog4j構成がいくつか見つかり、それを利用しました。それは単なるjarファイル(バンドルではない)であるため、カスタムロギング設定を指定できるフラグメントを使用していませんでした。これにより、他の処理が必要になりました。
ロギングコンフィグレーションを指定するためにバンドルフラグメントを設定する必要がありました。
最終的に、別のバンドルにログインする必要があるときに何が起こっているのかを把握しました(この時点でatめたばかりで、警告レベル以上のログの使用に戻りました)。この新しいバンドルは見つかりませんでしたロギング設定! (そのため、同じOSGi環境で実行する3つのバンドルがあり、それぞれが異なるlog4j動作を使用していました.1つはフラグメント設定を使用し、もう1つはランダムなEclipseロギング設定を使用し、最後にロギング構成を持たない新しいバンドルを使用しました)これら3つのバンドルの詳細な比較により、Manifest.MFファイルの違いが明らかになり、現在ではすべてがフラグメントバンドルを使用しています。
他のヒント
これはあなたの質問に対する実際の答えではありませんが、この ekkeによる一連の記事。
すでに読んでいると思います" Eclipse Equinox / OSGiでのLog4Jの使用":
osgiセッションをコンソールモードで起動しましたか?
java -jar org.eclipse.osgi_3.3.0.v20070530.jar -console -noExit -clean
そのようにして、純粋なosgi環境でlog4jをテストし、そこで動作するかどうかを確認できます。
解決策を見つけたら(それを回答として公開する)知っておいてください。投票します;)