Equinox中的LogService和LogReaderService如何工作?

时间:2012-08-17 12:47:08

标签: eclipse logging osgi equinox

我正在开发一个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之间进行绑定......

谢谢! 亚历

2 个答案:

答案 0 :(得分: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处理,但仍然,因为可能没有向此服务注册的LogListener(取决于其他已启动的包),

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

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

答案 1 :(得分:3)

好吧,以防其他人对这个问题感兴趣。我在Google Code中找到了一个非常好的wiki,解释了OSGi日志记录系统是如何工作的,必须阅读':

Understanding OSGi Logging

由于我只想使用日志在控制台中打印,所以提出的解决方案对我有用。唯一的问题是找到按预期工作的LogService的实现。 article中指出的那个实际上有效,但实现了1.1版本,而据我所知,当前的LogService规范是version 1.3。所以我做的是,从以前的实现中下载了源代码,并根据我的口味和最新版本(1.3)规范调整了该实现。您可以找到来源here

显然,您也可以使用您的或其他任何LogService接口的实现,直到您。

此外,如果您计划使用后端现有的日志记录服务,例如commons-logging或sl4j等...我推荐这些链接,它们提供了有关从哪里开始的很好的信息:

Building backend OSGi logging overview

这对我来说太过分了,因为我想要的只是一种在OSGi控制台中打印消息的方法,但不必使用log4j,片段等。

希望有人发现这个有用

此致 亚历