Невозможно использовать Log4J2 с Wildfly

Я работаю над приложением JEE, которое использует log4j2 для ведения журнала. Я пытаюсь развернуть его на Wildfly 15, но не могу заставить его правильно регистрироваться, заявляя

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

Вот что я сделал:

  • Я добавил log4j2-api.jar в качестве системного модуля в Wildfly (system/layers/base/org/apache/log4j2/main) с помощью простого файла module.xml.
  • Я взял код с https://github.com/jboss-logging/log4j2-jboss-logmanager, создал JAR и добавил его в качестве системного модуля в Wildfly (system/layers/base/org/jboss/log4j2/logmanager/main) с файлом module.xml, который определяет предоставляемую службу. :
    <provides>
        <service name="org.apache.logging.log4j.spi.Provider">
            <with-class name="org.jboss.logmanager.log4j.JBossProvider" />
        </service>
    </provides>
  • Я добавил org.apache.log4j2 и org.jboss.log4j2.logmanager в качестве зависимостей к модулю org.jboss.logmanager, указав services="export" в последнем.

Мне известно о https://issues.redhat.com/browse/WFCORE-482, но я не могу сделать из этого правильных выводов.

Кто-нибудь может помочь или знает, как диагностировать дальше, что здесь происходит?


Для полной справки, файл module.xml для org.jboss.log4j2.logmanager выглядит следующим образом:

<module xmlns="urn:jboss:module:1.8" name="org.jboss.log4j2.logmanager">
    <resources>
        <resource-root path="log4j2-jboss-logmanager.jar"/>
    </resources>
    <dependencies>
        <module name="org.apache.log4j2"/>
        <module name="org.jboss.logmanager"/>
    </dependencies>
    <provides>
        <service name="org.apache.logging.log4j.spi.Provider">
            <with-class name="org.jboss.logmanager.log4j.JBossProvider" />
        </service>
    </provides>
</module>

хотя я пробовал ссылаться на org.jboss.logmanager как на зависимость от org.jboss.log4j2.logmanager и наоборот.

Module.xml для org.apache.log4j2 выглядит так:

<module xmlns="urn:jboss:module:1.1" name="org.apache.log4j2">
    <resources>
        <resource-root path="log4j-api.jar"/>
    </resources>
</module>

person stmoebius    schedule 19.05.2020    source источник
comment
Как выглядят ваши module.xml файлы? Они должны выглядеть примерно так: gitphub.com/diff-a20c1b8d1398b3f2b8d531a1d04fd8c1 / и github/wildjamez-pcore-p.com/wildjamez зафиксировать/.   -  person James R. Perkins    schedule 19.05.2020
comment
Почему модуль org.jboss.log4j2.logmanager должен зависеть от org.jboss.logmanager, а не наоборот? Откуда будет ссылка на модуль org.jboss.log4j2.logmanager? Кажется, это та часть, которую я не понимаю.   -  person stmoebius    schedule 19.05.2020
comment
Добавил оба module.xml выше и попробовал как log4j2.logmanager в зависимости от logmanager, так и наоборот, с тем же результатом.   -  person stmoebius    schedule 19.05.2020
comment
Потому что org.jboss.log4j2.logmanager требует org.jboss.logmanager, а не наоборот.   -  person James R. Perkins    schedule 19.05.2020


Ответы (1)


В вашем org.jboss.log4j2.logmanager module.xml вам не нужно это определение <provides/>. В остальном ваши файлы module.xml выглядят правильно.

Далее вам нужно определить модули org.jboss.log4j2.logmanager и org.apache.log4j2 в вашем развертывании. Если вы используете jboss-deployment-structure.xml, для WAR это будет выглядеть примерно так:

<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.apache.log4j2"/>
            <module name="org.jboss.log4j2.logmanager" export="true"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

Одно небольшое замечание: они, вероятно, должны находиться непосредственно в каталоге modules, а не в каталоге modules/system/layers/base. Хотя это не ломает ничего, что действительно предназначено для модулей, предоставляемых сервером.

person James R. Perkins    schedule 19.05.2020
comment
Спасибо. Это работает нормально, пока я запускаю Wildfly из командной строки, используя standalone.bat. Как только я использую сервисную оболочку (Tanuki), она ломается. У меня нет дескриптора структуры развертывания, и я использую EAR. Как бы я ни настраивал путь к классам, jboss.modules.system.pkgs, глобальные модули (standalone.xml), определения модулей и зависимости, я не могу заставить это работать. Что происходит, так это то, что поток службы MSC загружает EJB из JAR в EAR, и в его контексте он может видеть log4j2-api, но не JBossProvider. Есть идеи? - person stmoebius; 25.05.2020
comment
Вы определенно не хотите использовать jboss.modules.system.pkgs. Лучше всего использовать запись jboss-deployment-structure.xml или Dependencies: в файле манифеста. - person James R. Perkins; 26.05.2020
comment
С глобальными модулями убедитесь, что вы также пытаетесь использовать meta-inf="true" в модуле org.jboss.log4j2.logmanager. - person James R. Perkins; 26.05.2020