我正在开发OSGi Equinox捆绑软件,我想向其中添加一些日志记录,多数情况下将其重定向到OSGi控制台,仅用于调试目的。

丢弃log4j的用法后,由于Equinox中有几个日志记录服务(LogService和ExtendedLogService),因此我发现了这篇文章介绍了如何使用LogService:

OSGi Log Service

所以我想出了一个看起来像这样的激活器:

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控制台中看到记录的消息...寻找更多信息,我发现了这个线程:

How to use Equiniox's LogService ?

一些答案建议我应该实现一个LogServiceReader对象,该对象实际上侦听日志记录事件,并且(这只是我的猜测),将记录的消息重定向到任何内容(文件,控制台等)。

现在我的问题,不仅仅是如何实现此接口,是我如何在LogServiceReader的实现和Activator中使用的LogService之间进行绑定...

谢谢!
亚历克斯

最佳答案

要直接回答问题:

LogService是负责存储日志消息的服务。
LogReaderService是一项服务,负责读取这些日志消息并将其分发给日志侦听器。
这些之间的绑定是自动完成的。
您将自己做的是在一侧将日志消息发送到LogService,并可能将LogListeners绑定到LogReaderService,这将在另一侧(例如控制台)的某个位置写出日志。


要解决日志不显示的问题,您需要做一些其他事情。

首先,您是否在osgi容器中安装了提供LogService和LogReaderService实现的捆绑软件?

您可以通过在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春分依赖项也提供了这样的服务。

重新启动和停止您自己的捆绑包。现在它应该显示“有LogService可用”。


现在,您的消息已记录到LogService并由LogReaderService处理,但是仍然可以,因为可能没有向该服务注册LogListener(取决于启动的其他包),

您可能需要自己在捆绑软件激活器中添加LogListener。

有关执行此操作的示例捆绑激活器,请检查http://blog.kornr.net/index.php/2008/12/09/understanding-the-osgi-logging-service

10-06 05:38