2015-10-16 6 views
0

В моем текущем приложении для ведения журнала используется Logback. Я использовал Apache Felix для развертывания платформы OSGi, которая позволяет динамически регистрировать связки во время выполнения. Настройка Felix выглядит следующим образом:Apache Felix Регистрация OSGi с помощью журнала

... 

    //System.out.println("Building OSGi Framework"); 
    FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next(); 
    Map<String, String> config = new HashMap<>(); 

    // specify the class loader 
    config.put(Constants.FRAMEWORK_BUNDLE_PARENT, Constants.FRAMEWORK_BUNDLE_PARENT_FRAMEWORK); 

    // specify the osgi cache directory 
    config.put(Constants.FRAMEWORK_STORAGE, appConfig.getOsgiCacheDir()); 

    // make sure the cache is cleaned 
    config.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT); 

    // expose api 
    config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "list.of.packages.to.export"); 

    // more properties available at: http://felix.apache.org/documentation/subprojects/apache-felix-service-component-runtime.html 
    config.put("ds.showtrace", "false"); 
    config.put("ds.showerrors", "true"); 
    config.put("felix.fileinstall.dir", appConfig.getActiveOsgiExtDir()); 
    config.put("felix.fileinstall.tmpdir", appConfig.getTempOsgiExtDir()); 
    config.put("felix.fileinstall.bundles.startTransient","true"); 
    config.put("felix.fileinstall.poll","5000"); 
    config.put("felix.fileinstall.bundles.new.start", "true"); 

    LOG.debug("OSGi config: " + config.toString()); 

    framework = frameworkFactory.newFramework(config); 

    try { 
     framework.init(); 
     FrameworkEvent event; 

     do { 
      framework.start(); 
    ... 

Единственная проблема заключается в том, что с Felix не существует регистрации. Когда пучок не загружается по какой-то причине, я не понимаю, почему! Я знаю, что я могу использовать следующее в пучке, чтобы получить родительский регистратор:

ServiceReference ref = bundleContext.getServiceReference(LogService.class.getName()); 
if (ref != null) { 
    LogService log = (LogService) bundleContext.getService(ref); 
    ... 
    } 

Однако, я не понимаю, как я могу получить Феликс использовать Logback в качестве регистратора в первую очередь.

+0

Вам не нужно вести журнал, чтобы понять, почему пучок не запускается. Просто запустите его явно из оболочки и наблюдайте там сообщение об ошибке. –

+1

Ваш абсолютно правильный. Тем не менее, я вообще должен иметь возможность выполнять протоколирование и для пакетов, чтобы иметь возможность передавать их ведение журнала в основную инфраструктуру приложения. – tarka

ответ

0

Я думаю, вы используете Apache Felix Log, чтобы иметь LogService в вашем контейнере OSGi. Apache Felix Log реализует главу «101 Спецификация службы регистрации» спецификации OSGi Enterprise.

Основная часть реализации LogService хранит зарегистрированные записи на некоторое время, но не записывает их нигде. Вы можете запросить записанные записи через LogReaderService или LogListener.

С другой стороны, вы можете использовать Logback в том, как вы добавили slf4j-api и slf4j-logback в свой контейнер OSGi. Таким образом, все, что регистрируется с помощью классов slf4j-api, регистрируется по протоколу logback.

Если мои догадки были правильными, то пакет osgi-loglistener-slf4j мог бы вам помочь. Этот пакет ничего не делает, кроме как регистрирует LogListener за каждые LogReaderService в среде и пересылает все записи в журнале, которые он ловит до slf4j-api. Расслоение доступно на maven-central

Если вы не хотите использовать SLF4J API, вы можете написать подобный пакет, который делает пересылку журнала из LogReaderService в Logback. Если вы проверите источник связанного пакета, вы увидите, что он реализован только с несколькими строками кода.

+0

Я действительно думаю, что вы на 100% правильны. Тем не менее, я не могу в настоящее время получить osgi-loglistener-slf4j для регистрации без ошибок. Будет обновляться, когда это исправлено. – tarka

+0

Какая ошибка у вас? –

+0

'Невозможно решить org.everit.osgi.loglistener.slf4j [3] (R 3.0): отсутствует требование [org.everit.osgi.loglistener.slf4j [3] (R 3.0)] osgi.wiring.package; (& (osgi.wiring.package = org.osgi.service.log) (версия> = 1.3.0) (! (версия> = 2.0.0))) Неразрешенные требования: [[org.everit.osgi.loglistener. slf4j [3] (R 3.0)] osgi.wiring.package; (& (osgi.wiring.package = org.osgi.service.log) (версия> = 1.3.0) (! (версия> = 2.0.0)))] ' – tarka