LoggerFactory не может получитьLogger - PullRequest
0 голосов
/ 21 ноября 2018

Я сейчас использую 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 голосов
/ 21 ноября 2018

LoggerFactory является сервисом OSGi.Вы должны получить его из реестра службы OSGi.См. мою презентацию EclipseCon Europe 2018 для получения дополнительной информации.

0 голосов
/ 21 ноября 2018

Здесь - исходный код org.osgi.service.log.LoggerFactory.

Как видите, это интерфейс без статических методов, поэтому этот код:

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

просто недействительно.

Чтобы исправить это, используйте slf4j в качестве внешнего интерфейса (это означает замену org.osgi.service.log.LoggerFactory import на org.slf4j.LoggerFactory и т. д.).

UPDATE

Если вы хотите придерживаться 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;
...