22

私は 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

アップデート:

私は今、次のさまざまな組み合わせを試しました。

また、 OSGi をプロンプトから手動で実行している場合にのみ、DEBUG またはそれ以下のレベルのメッセージが表示されます (これは私が開発しているものには非現実的です)。さらに、さまざまなプロパティ ファイルを介して、他の種類のログ構成に影響を与えることはできません。その点で私が試みることはすべて、日食の設定によって上書きされるようです。

また、上記のライブラリのさまざまな構成ファイルを、ここで提案されているようにそれぞれのライブラリに接続されたプラグイン フラグメントなど、さまざまな場所に配置しようとしましたが、それでも同じ結果が発生します。

私はカスタム LogListener を実装し、System.out.println を使用してログ メッセージのパス全体をトレースし (とにかく方法は知っています)、デバッグ メッセージ、基礎となるログ API によって出力されるまで存在します。私は使用していますが、それらは消えます。

4

2 に答える 2

23

3日後…

問題が見つかりました!やらなければならないことが 2 つあります。まず、1 つの MANIFEST.MF ファイルに問題がありました。

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動作します。Eclipse レベルの log4j 構成を見つけて、それを利用したようです。これは単なる jar (バンドルではありません) であるため、カスタム ロギング構成を指定できるフラグメントを使用しませんでした。

ロギング構成を指定するには、バンドル フラグメントをセットアップする必要がありました。 VonCからのこのリンクは、それを行うための情報を提供してくれました。残念ながら、MANIFEST.MF が正しくないパッケージには、Bundle-ClassPath で指定された log4j jar がまだあり、Import-Package リストを上書きしているようです。

別のバンドルにログインする必要があるときに何が起こっているのかを最終的に把握しました (この時点であきらめて、警告レベル以上でログを使用することに戻りました)。この新しいバンドルはログ構成を見つけることができませんでした。 ! (そのため、同じ OSGi 環境で 3 つのバンドルを実行し、それぞれ異なる log4j の動作を使用しました。1 つは私のフラグメント設定を使用し、もう 1 つはランダムな Eclipse ロギング設定を使用し、最後にロギング構成を持たない新しいバンドルを使用しました。)これら 3 つのバンドルを詳細に比較すると、Manifest.MF ファイルの違いが明らかになり、現在はすべてフラグメント バンドルを使用しています。

Eclipse Zone、VonC 、Ekkesの多くの作者、そして freenode の#eclipseに参加している皆さんの助けと忍耐に、心から感謝します:)

于 2008-10-24T22:53:48.317 に答える
18

これはあなたの質問に対する実際の回答ではありませんが、ekke によるこの一連の記事でいくつかの手がかりが見つかるかもしれません。

「 Eclipse Equinox/OSGi での Log4J の使用」を既に読んでいると思います。

コンソール モードで osgi セッションを開始しましたか?

java -jar org.eclipse.osgi_3.3.0.v20070530.jar -console -noExit -clean

そうすれば、純粋な osgi 環境で log4j をテストし、そこで動作するかどうかを確認できます。

解決策が見つかったらお知らせください(回答として公開してください)。投票します;)

于 2008-10-22T08:14:01.570 に答える