2

我目前正在实现一个记录器,我想知道为什么代码不会运行。大多数代码片段是这样的:

Logger log = LoggerFactory.getLogger(this.getClass());

我的导入课程:

import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.log.LogReaderService;
import org.osgi.service.log.LogService;
import org.osgi.service.log.Logger;
import org.osgi.service.log.LoggerFactory;

但我似乎无法使用 getLogger。

这是为什么?

提前致谢!没有可用的 getLogger() 类

4

2 回答 2

2

这里是源代码org.osgi.service.log.LoggerFactory

如您所见,它是一个没有静态方法的接口,因此代码如下:

Logger log = LoggerFactory.getLogger(this.getClass());

根本无效。

将此slf4j用作前端修复(这意味着将org.osgi.service.log.LoggerFactory导入替换为org.slf4j.LoggerFactory等)。

更新

如果您想坚持,请org.osgi.service.log.LoggerFactory按照以下步骤操作:

获取 LoggerFactory 实例:

public class Activator implements BundleActivator
{
    private volatile LoggerFactory loggerFactory;

    public void start(BundleContext context) throws Exception 
    {   
        ServiceReference ref = context.getServiceReference(LoggerFactory.class.getName());
        if (ref != null)
        {
            loggerFactory = (LoggerFactory) context.getService(ref);
        }
    }

    //..

然后,您可以在包中的其他地方使用 LoggerFactory 为任何类获取 Logger:

Logger logger = loggerFactory.getLogger(Foo.class);

更新2

更好的选择是获取服务类型为 LoggerFactory 的参考,如下所示:

@Reference(service = LoggerFactory.class)
private Logger logger;
于 2018-11-21T09:49:54.710 回答
1

LoggerFactory 是一个 OSGi 服务。您需要从 OSGi 服务注册表中获取它。有关更多信息,请参阅我的 EclipseCon Europe 2018 演示文稿

于 2018-11-21T14:21:26.343 回答