Log4J2 не установлен в качестве регистратора в среде OSGi

Я использую Commons-Logging, который должен соединиться с Log4J2 в среде OSGi и поэтому добавил зависимости, export-package и import-package в pom.xml как показано ниже, но регистратор не настроен на регистратор Log4J2. Ошибки не отображаются, но при отладке я обнаружил, что для него установлено значение JDK14Logger.

    <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-jcl</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>2.8.2</version>
        </dependency>

        <Export-Package>
            org.apache.logging.log4j.*,
            org.apache.commons.logging.*
        </Export-Package>
        <Import-Package>
            !org.apache.logging.log4j.*,
            !org.apache.commons.logging.*,
            *;resolution:=optional
        </Import-Package>

[ОБНОВИТЬ]

Из списка рассылки пользователя log4j я понял, что это связано с немодулярной природой ServiceLoader. Я проверил несколько случаев использования ServiceLoader в среде OSGi, чтобы найти реализации интерфейсов, но все еще не мог понять, как это можно заставить работать.

Я попробовал это, используя pax logging, но результат тот же, за исключением того, что logger теперь устанавливается на JclLogger

2 ответа

Как сказал Кристиан в другом ответе, лучше всего для входа в OSGI подходит пакет pax-loging.

Pax-логирование построено на SLF4J и может быть развернуто с различными возможными реализациями:

  • pax-логгирование-log4j2 (Log4J2)
  • pax-logging-logback (логбэк)

Раньше мы также использовали Log4J версии 1, но это не рекомендуется, так как две другие реализации работают хорошо.

Я лично не тестировал реализацию Logback в OSGI, но Log4j2 работает (с некоторыми ограничениями).

Одним из преимуществ этого решения является то, что вы не должны импортировать какую-либо реализацию ведения журнала в свои пакеты, вам нужно только сделать следующее:

  • объявить slf4j-api как предоставленную зависимость (область действия maven)
  • в конечном итоге объявите slf4j-simple в качестве области тестирования в вашем maven

Вам не нужно настраивать какие-либо параметры maven-bundle-plugin в отношении ведения журнала любого из ваших пакетов.

Вот шаг, как это сделать в ServiceMix версии 7.0.1; в этом выпуске изначально используются сервисы pax-logging-services, но следующий шаг показывает, что нужно изменить.

Установив пакеты в startup.properties (сразу после загрузки), вы гарантируете, что все библиотеки будут загружены в начале.

Эти два заменяют старую версию pax-logging-apiа также pax-logging-serviceзаменен на pax-logging-log4j2:

      mvn\:org.ops4j.pax.logging/pax-logging-api/1.11.13 = 8
mvn\:org.ops4j.pax.logging/pax-logging-log4j2/1.11.13 = 8

затем в файле: org.ops4j.pax.logging.cfgвы упоминаете только строку:

      org.ops4j.pax.logging.log4j2.config.file=${karaf.etc}/log4j2.xml

и добавьте файл log4j2.xml в папку ${karaf.etc} (установка servicemix/etc).

Вы должны скопировать библиотеки в ${karaf.home}/systemпапка.

Это если вам просто нужен стандартный файл журнала.

Теперь об ограничениях: если вам нужно создать свой журнал как документ json, я смог использовать только устаревший файл log4j2.xml.

Для настройки JSONLayoutвы можете следить за моим другим ответом .

Короче говоря:

Добавьте три зависимости Джексона в startup.properties:

      mvn\:com.fasterxml.jackson.core/jackson-annotations/2.12.4 = 6
mvn\:com.fasterxml.jackson.core/jackson-core/2.12.4 = 6
mvn\:com.fasterxml.jackson.core/jackson-databind/2.12.4 = 6

а также pax-logging-log4j2-extra(если вы используете реализацию log4j2):

      mvn\:org.ops4j.pax.logging/pax-logging-log4j2-extra/1.11.13 = 6

В моей версии мне пришлось добавить три следующие строки в overrides.properties:

      mvn:com.fasterxml.jackson.core/jackson-core/2.12.4;range="[2,3)"
mvn:com.fasterxml.jackson.core/jackson-databind/2.12.4;range="[2,3)"
mvn:com.fasterxml.jackson.core/jackson-annotations/2.12.4;range="[2,3)"

Я создал простой docker-compose с сервисным миксом 7.0.1 на github с двумя способами создания журналов json (новый JsonTemplateLayout в данный момент не работает).

Если вышеупомянутое находится в вашем пользовательском пакете, то это не правильно. В вашем пользовательском пакете вы должны просто использовать API регистрации общего ресурса и не изменять настройки плагина maven bundle.

Затем он создаст операторы Import-Package для API регистрации общего ресурса, но не для log4j, что вам и нужно.

Затем вы должны установить подходящую структуру ведения журнала во время выполнения. Я знаю, что pax-logging может обрабатывать протоколирование общего достояния OSGi-совместимым способом. Может быть, простой log4j2 тоже работает, но я не уверен.

Другие вопросы по тегам