Ale*_*oVK 4 eclipse logging osgi equinox
我正在开发一个OSGi Equinox软件包,我想添加一些日志记录,主要是重定向到OSGi控制台,仅用于调试目的.
在放弃使用log4j之后,由于Equinox(LogService和ExtendedLogService)中有几个日志服务,我发现这篇文章描述了如何使用LogService:
所以我提出了一个看起来像这样的Activator:
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;
}
Run Code Online (Sandbox Code Playgroud)
好吧,我从未在OSGi控制台中看到记录的消息...寻找更多信息,我找到了这个帖子:
一些答案表明我应该实现一个实际侦听日志事件的LogServiceReader对象(这只是我的猜测),将记录的消息重定向到任何(文件,控制台等...)
现在我的问题,不仅仅是如何实现这个接口,我如何在我的LogServiceReader实现和Activator中使用的LogService之间进行绑定...
谢谢!亚历克斯
直接回答这个问题:
LogService是一种负责存储日志消息的服务.LogReaderService是一种服务,负责读取这些日志消息并将它们分派给日志侦听器.这些之间的绑定是自动完成的.您将自己做的是一方面向LogService发送消息,并可能将LogListeners绑定到LogReaderService,这将在某处写出日志,例如另一方面的控制台.
要解决日志不出现的问题,您需要做一些额外的事情.
首先,你是否在osgi容器中安装了一个提供LogService和LogReaderService实现的bundle?
你可以通过向你的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");
}
Run Code Online (Sandbox Code Playgroud)
或者只需在equinox控制台中键入"bundles",然后查找提供org.osgi.service.log.LogService和org.osgi.service.log.LogReaderService的软件包.
如果没有可用的LogService,请安装一个.例如:
install http://oscar-osgi.sf.net/repo/log/log.jar
Run Code Online (Sandbox Code Playgroud)
org.apache.log4j equinox依赖项也提供了这样的服务.
再次启动和停止自己的捆绑包.它现在应该打印"有一个LogService可用".
现在您的消息被记录到LogService并由LogReaderService处理,但是,由于可能没有向此服务注册的LogListener(取决于启动的其他bundle),
您可能需要在捆绑Activator中自己添加LogListener.
有关执行此操作的示例bundle Activator,请查看http://blog.kornr.net/index.php/2008/12/09/understanding-the-osgi-logging-service.
| 归档时间: |
|
| 查看次数: |
4865 次 |
| 最近记录: |