2015-05-05 3 views
6

Я пытаюсь использовать пакеты log4j2 OSGi, но, похоже, log4j2 api не может найти ядро ​​log4j2 в среде OSGi. Я постоянно получаю следующее исключение:Log4j2 api не может найти ядро ​​Log4j2 в среде OSGi

ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console 

я нашел то же самое исключение обсуждается в нескольких местах, но все-таки я не мог понять этот вопрос. Isuspect Я получаю эту проблему, потому что log4j2 api не может найти log4j-provider.properties внутри каталога META-INF ядра log4j2. Есть ли подсказка, почему я получаю это исключение и как я могу исправить проблему? (Если кто-нибудь имеет правильный файл POM для добавления зависимостей log4j и обвязка пожалуйста, поделитесь со мной)

Эти зависимости я использовал

<dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.2</version> 
    </dependency> 

Я использую Apache Felix как расслоении плагин. Эта ошибка возникает из-за того, что ресурсы внутри META-INF log4j2-core специально для файла log4j-providoer.properties не видны log4j api.

Спасибо!

+0

Вы загружаете пакет log4j-core? Как вы управляете своими зависимостями? С Maven? – Puce

+0

Я добавил оба ядра log4j2 и api в зависимости. – Grant

+0

Можете ли вы указать, какие рамки вы используете? Этот файл свойств недоступен из другого контекста связки, необходим механизм для его загрузки из -core, см. Мой предварительный ответ. –

ответ

6

log4j-жильный расслоение регистрирует расслоение слушателя при запуске Активатор и начинает поиск лог плагинов и если что-то будет найден, он выполняет последовательность операций, аналогичную обычной инициализации Logger (на самом деле не идиоматическое OSGi и я не уверен он работает, но, по-видимому, он установлен как минимум и LoggerContextFactory), просто чтобы убедиться в этом, вы установили и запустили пул log4j-core и проверили, что ничего не изменилось?

Update:

Я сделал некоторые испытания и обнаружили, что является приемлемым решением/обходной путь для log4j2 вопросов OSGi. Но, как рекомендовал кто-то другой, я бы использовал slf4j, pax-logging или просто службу журнала OSGi (более простой из группы).

@Grant, у вас есть 2 отдельные вещи, которые должны быть исправлены:

1. Как описано выше, «Log4j2 не может найти реализацию каротаж» ошибка вызвана тем, что log4j2-api расслоение не может найти log4j-provider.свойства файл и, после этого исправлено, log4j2-api не может найти классы log4j2-core (это другой комплект, а log4j2-api не имеет конкретного Import-Package: для этих классов).

Обойти это создать небольшой фрагмент сверток для log4j2-api (я назвал мое log4j-Апи-config.jar) с этим .properties файл в META-INF и манифест, который заставляет динамический импорт:

Manifest-Version: 1.0 
    Bundle-ManifestVersion: 2 
    Bundle-Name: Log4j API configurator 
    Bundle-SymbolicName: org.apache.logging.log4j.apiconf 
    Bundle-Version: 1.0.0 
    Bundle-Vendor: None 
    Bundle-RequiredExecutionEnvironment: OSGi/Minimum-1.2 
    Fragment-Host: org.apache.logging.log4j.api 
    DynamicImport-Package: * 

Я импортирую * здесь, вы можете улучшить его, добавив требуемое подмножество пакетов log4j2-core, которое необходимо log4j2-api.

При этом эта ошибка исчезнет, ​​но log4j заметит, что вы не предоставили конфигурационный файл log4j2, исправление (только в этом случае).

2. На данный момент Феликс покажет это:

log4j2.xml not found by org.apache.logging.log4j.core 
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. 

и я полагаю, вы могли бы хотеть, чтобы добавить свой собственный log4j2.xml без баловаться с оригинальным log4j2-core.jar. Вы можете сделать это создать еще один фрагмент сверток, на этот раз организовано log4j2-core, с только log4j2.xml файл конфигурации в корне и простой манифест:

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: Log4j Core configurator 
Bundle-SymbolicName: org.apache.logging.log4j.coreconf 
Bundle-Version: 1.0.0 
Bundle-Vendor: None 
Bundle-RequiredExecutionEnvironment: OSGi/Minimum-1.2 
Fragment-Host: org.apache.logging.log4j.core 

Я использовал эту простую конфигурацию log4j2.xml во время моих тестов:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="INFO"> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
    </Appenders> 
    <Loggers> 
    <Root level="info"> 
     <AppenderRef ref="Console"/> 
    </Root> 
    </Loggers> 
</Configuration> 

с этим вам не нужно такого рода «мост» Bundle вы описали ниже больше, и вы просто будете нуждаться в простой Import-Package: org.apache.logging.log4j использовать log4j из вашего комплекта.

Update 2:

Важно отметить, что эти два фрагмента не являются НЕ зависимости от исходных пучков (нет необходимости изменять log4j банки или или даже ваши связки, чтобы добавить импорт/экспорт), так оригинальных пучков и ваши собственные пользовательские будут оставаться нетронутыми. Кроме того, они также не зависят от исходного пакета, это просто базовый архив jar с манифестом и дополнительным текстовым файлом, без кода, без необходимости импорта-пакета или Export-Package.

Вам просто нужно установить каждый фрагмент после установки пакета хоста.

Я создал оба фрагмента вручную, начиная с пустой банки и копируя в архив файл свойств и изменяя MANIFEST.MF текстовым редактором, вы можете создать их как с этим pom.xml, не забудьте скопировать log4j -provider.properties, где находится pom.xml.

Для log4j2-api фрагмента:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>my.group</groupId> 
    <artifactId>log4j2-api-config</artifactId> 
    <version>1.0</version> 
    <name>log4j2-api-config</name> 
    <packaging>bundle</packaging> 
    <properties> 
     <java-version>1.7</java-version> 
    </properties> 

    <dependencies> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <version>2.0.0</version> 
       <extensions>true</extensions> 
       <configuration> 
        <instructions> 
         <Bundle-SymbolicName>org.apache.logging.log4j.apiconf</Bundle-SymbolicName> 
         <Bundle-Name>Log4j API Configurator</Bundle-Name> 
         <Bundle-Version>1.0.0</Bundle-Version> 
         <Fragment-Host>org.apache.logging.log4j.api</Fragment-Host> 
         <DynamicImport-Package> 
          *;resolution:=optional 
         </DynamicImport-Package> 
        </instructions> 
       </configuration> 
      </plugin> 
     </plugins> 
     <resources> 
      <resource> 
       <directory>.</directory> 
       <includes> 
        <include>log4j-provider.properties</include> 
       </includes> 
       <targetPath>META-INF</targetPath> 
      </resource> 
     </resources> 
    </build> 
</project> 

Измените этот POM в случае необходимости (включаемый файл, имена пакетов), чтобы сгенерировать другую с конфигурацией log4j2-core.

+0

Я использую Felix, в консоли OSGi я могу видеть все log4j-api и log4j-core в активном состоянии, однако я получаю вышеупомянутую ошибку. Это прекрасно работает, если я создаю отдельный пакет с зависимостями для api и ядра и экспортируем пакет org.apache.logging. *, А также должен скопировать файл log4j-provider.properties в каталог META-INF этого пакета, но я хочу использовать непосредственно пакеты log4j2 OSGi. – Grant

+0

Привет, я обновил свой ответ. –

+0

Можете ли вы поделиться с нами pom.xml, которые вы использовали? Нужно ли добавлять этот фрагмент в зависимость, где мы используем log4j2? – Grant

0

Log4j не подходит для использования в среде OSGi. К счастью, есть хорошая замена в замене pax-logging. В вашем комплекте вы используете log4j api или любой другой поддерживаемый apis (я предпочитаю slf4j-api). Затем вы развертываете ведение журнала pax в своей инфраструктуре OSGi и в своем комплекте. Вы можете настроить ведение журнала pax с помощью стандартной конфигурации log4j. Таким образом, он очень прост в использовании. Если вы хотите очень просто начать, вы можете просто установить apache karaf и развернуть свой пакет. Karaf уже включает в себя полностью настроенный протокол pax.

+0

Это не очень хороший вариант, так как я задал вопрос для log4j2 – Grant

+0

Log4j не построен для OSGi. Pax logging - единственный вариант, который я знаю. Это не плохой вариант, хотя, как и на стороне разработки, вы используете API log4j, как и раньше. –

+0

Как мы можем сказать, что log4j2 не построен для OSGi? – Grant

0

Попробуйте изменить имя файла JAR-то не содержит основного слова (например: log4j-Зоре) и попробуйте еще раз

+1

затем переименуйте его в оригинальное имя и увидите, что это хорошо работает. – guleryuz

+0

Подождите, почему это исправить? OSGi не работает таким образом. –

0

Вам необходимо указать связанные OSGI зависимости от вашего пучка в META-INF/MANIFEST.MF путем добавления следующих зависимостей:

Require-Bundle: org.apache.logging.log4j.core;org.apache.logging.log4j.api

0

Для меня эта ошибка решается:

  • обеспечивая что log4j-апи пучок фактически активируется - и не только решить - перед вызовом регистратора. Я сделал это, установив его в Auto-Start с низким начальным уровнем.
  • Пусть log4j-api импортирует классы log4j-core (как упоминалось в @ @ime), чтобы убедиться, что он находит log4j-core. Самый чистый способ сделать это - использовать фрагмент. Вместо динамического импорта вы можете также добавить это к манифесту:

    Require-Bundle: org.apache.logging.log4j.core

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

Кроме того, я обнаружил, что не требуется, чтобы пакет log4j-core был активирован (разрешен только), но обратите внимание, что это означает, что активатор не может найти пользовательские плагины log4j2.

+0

В моей рабочей области Eclipse мне как-то не нужен фрагмент с динамическим импортом для log4j-api. Он смог загрузить log4j-core, не делая этого. Но в моей окончательной версии продукта я все же получил ту же ошибку. Конфигурация моих пакетов одинакова - до заказа! Я подозреваю, что log4j-api (2.3.0) выполняет некоторые трюки с загрузкой (возможно, с загрузчиком классов потоков), которые могут работать или не работать в OSGi в зависимости от реализации OSGi (для меня: org.eclipse.osgi_3.7.2.v20120110 -1415.jar), в котором разрешены пучки.) –

Смежные вопросы