LoggerFactory无法获取Logger

时间:2018-11-21 09:18:19

标签: java eclipse logging osgi loggerfactory

我目前正在实现Logger,并且想知道为什么代码无法运行。 大多数代码段如下:

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。

那是为什么?

提前谢谢! No getLogger() classes are available

2 个答案:

答案 0 :(得分:2)

Hereorg.osgi.service.log.LoggerFactory的源代码。

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

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

完全无效。

要解决此问题,请使用slf4j作为前端(这意味着将org.osgi.service.log.LoggerFactory导入替换为org.slf4j.LoggerFactory等)。

更新

如果您想坚持使用org.osgi.service.log.LoggerFactory,请按照this进行操作:

获取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);

UPDATE2

一个更好的选择是获得一个引用,其服务类型为LoggerFactory,如下所示:

@Reference(service = LoggerFactory.class)
private Logger logger;

答案 1 :(得分:1)

LoggerFactory是OSGi服务。您需要从OSGi服务注册表中获取它。有关更多信息,请参见my EclipseCon Europe 2018 presentation