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 тоже работает, но я не уверен.