5

私は OSGi Equinox バンドルを開発していますが、ロギングを追加したいと考えています。ほとんどの場合、デバッグ目的で OSGi コンソールにリダイレクトされます。

Equinox にはいくつかのロギング サービス (LogService と ExtendedLogService) があるため、log4j の使用を破棄した後、LogService の使用方法を説明している次の記事を見つけました。

OSGi ログ サービス

そこで、次のようなアクティベーターを思いつきました。

package org.example.servlet;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.log.LogService;
import org.osgi.util.tracker.ServiceTracker;
import org.eclipse.equinox.log.ExtendedLogService;

public class Activator implements BundleActivator {

private static BundleContext context;
private ServiceTracker logServiceTracker;
private LogService logService;

static BundleContext getContext() {
    return context;
}

/*
 * (non-Javadoc)
 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
 */
public void start(BundleContext bundleContext) throws Exception {
    Activator.context = bundleContext;      
    // create a tracker and track the log service
    logServiceTracker = new ServiceTracker(context, LogService.class.getName(), null);
    logServiceTracker.open();

    // grab the service
    logService = (LogService) logServiceTracker.getService();

    if(logService != null)
        logService.log(LogService.LOG_INFO, "Yee ha, I'm logging!");
}

/*
 * (non-Javadoc)
 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
 */
public void stop(BundleContext bundleContext) throws Exception {
    Activator.context = null;
}

まあ、ログに記録されたメッセージが OSGi コンソールに表示されることはありません...詳細情報を探していると、次のスレッドが見つかりました。

Equiniox の LogService の使用方法

いくつかの回答は、ログイベントを実際にリッスンし(これは私の推測です)、ログに記録されたメッセージを何にでもリダイレクトする LogServiceReader オブジェクトを実装する必要があることを示唆しています(ファイル、コンソールなど...)

ここで私の質問は、このインターフェイスを実装する方法よりも、LogServiceReader の実装とアクティベーターで使用される LogService の間のバインディングを行う方法です...

ありがとう!アレックス

4

2 に答える 2

6

質問に直接答えるには:

LogService は、ログ メッセージの保存を担当するサービスです。LogReaderService は、これらのログ メッセージを読み取り、ログ リスナーにディスパッチするサービスです。これらの間のバインドは自動的に行われます。自分で行うことは、一方の LogService にメッセージを記録し、場合によっては LogListeners を LogReaderService にバインドし、もう一方のコンソールなどのどこかにログを書き出すことです。


ログが表示されないという問題を解決するには、いくつかの追加作業を行う必要があります。

まず、LogService と LogReaderService の実装を提供するバンドルを osgi コンテナーにインストールしましたか?

Activator に次のようなものを追加することで、org.osgi.service.log.LogService の存在を確認できます。

if(logService != null){ 
        System.out.println("There is a LogService available"); 
        logService.log(LogService.LOG_INFO, "Yee ha, I'm logging!"); 
} 
else { 
        System.out.println("There is no LogService available"); 
}

または、equinox コンソールに「bundles」と入力して、org.osgi.service.log.LogService と org.osgi.service.log.LogReaderService を提供するバンドルを探します。

LogService が利用できない場合は、インストールします。例えば:

install http://oscar-osgi.sf.net/repo/log/log.jar

org.apache.log4j equinox 依存関係もそのようなサービスを提供します。

独自のバンドルを再度開始および停止します。「使用可能な LogService があります」と出力されるはずです。


メッセージは LogService に記録され、LogReaderService によって処理されますが、このサービスに LogListeners が登録されていない可能性があるため (開始された他のバンドルによっては)、

バンドル アクティベーターに LogListener を自分で追加する必要がある場合があります。

これを行う bundle Activator の例については、http://blog.kornr.net/index.php/2008/12/09/understanding-the-osgi-logging-serviceを確認してください。

于 2012-08-21T17:51:29.373 に答える