我正在开发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。