令人遗憾的是,没有
IEclipseContext注射就无法获得。关于如何在未附加到应用程序模型的类中使用eclipse 4
DI的答案中写道:
但是,问题在于,
IEclipseContext已经需要将已经注入到可以访问需要注入的对象的类中。
尽管如此,我已经解决了日志记录的问题,但我认为,该原理通常有效。总会有一些服务提供您所需的东西。如果您不能使用依赖项注入,则必须以某种方式(Internet和实验通常是)获得适当的服务类名称。如果获得服务类名称,则可以从捆绑软件上下文中获取实例引用。幸运的是,无需使用注入即可访问包上下文。
回到我们的日志记录问题。正在搜索的类是
org.osgi.service.log.LogService:
public class Activator implements BundleActivator { ... private static BundleContext context; ... public static BundleContext getContext() { return context; } ... public void start(BundleContext bundleContext) throws Exception { ServiceReference<?> logser = bundleContext.getServiceReference(LogService.class); LogService ls = (LogService)bundleContext.getService(logser); //print an error to test it (note, that info can be below the threshold) ls.log(LogService.LOG_ERROR, "The bundle is starting..."); Activator.context = bundleContext; } ...}等等!
!ENTRY eu.barbucha.rcp-experiment.kernel 4 0 2013-08-20 07:32:32.347!MESSAGE The bundle is starting...
就这样。以后
Activator.getContext(),如果需要,您可以使用来获得包上下文。
重要说明:很
遗憾,您现在无法降低阈值。JVM参数
-Declipse.log.level不会影响OSGI日志服务,您现在仅使用OSGI记录器。不幸的是,他们(可能已经临时地)对日志记录阈值进行了硬编码(请参阅eclipse
3.7中的如何记录警告和信息)。我发现,他们还没有修复它。开普勒版本中都没有。但是,您可以做出让步。您可以在可能的情况下进行
注入 。
最终解决方案(也可以全局捕获异常)
我扩展了激活器:
ServiceReference<?> logreser = bundleContext.getServiceReference(LogReaderService.class);LogReaderService lrs = (LogReaderService) bundleContext.getService(logreser); lrs.addLogListener(new LogListener() { @Override public void logged(LogEntry entry) { System.err.println("Something was logged: " + entry.getMessage()); }});当ewew是记录在某处的内容时,确实会出现 以记录某事 开头的文本。但是,最大的好处是,此类是我的。我可以控制
日志条目还包含级别。我还可以轻松设置阈值。例如在命令行上。



