我正在开发一个OSGi Equinox软件包,我想添加一些日志记录,主要是为了调试目的而重定向到OSGi控制台。
在放弃使用log4j之后,由于Equinox(LogService和ExtendedLogService)中有几个日志服务,我发现这篇文章描述了如何使用LogService:
所以我提出了一个看起来像这样的激活器:
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之间进行绑定......
谢谢! 亚历
答案 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日志记录系统是如何工作的,必须阅读':
由于我只想使用日志在控制台中打印,所以提出的解决方案对我有用。唯一的问题是找到按预期工作的LogService的实现。 article中指出的那个实际上有效,但实现了1.1版本,而据我所知,当前的LogService规范是version 1.3。所以我做的是,从以前的实现中下载了源代码,并根据我的口味和最新版本(1.3)规范调整了该实现。您可以找到来源here。
显然,您也可以使用您的或其他任何LogService接口的实现,直到您。
此外,如果您计划使用后端现有的日志记录服务,例如commons-logging或sl4j等...我推荐这些链接,它们提供了有关从哪里开始的很好的信息:
Building backend OSGi logging overview
这对我来说太过分了,因为我想要的只是一种在OSGi控制台中打印消息的方法,但不必使用log4j,片段等。
希望有人发现这个有用
此致 亚历