Не может заставить SLF4J работать со Glassfish 4

В прошлом я настраивал glassfish 3 для использования SLF4J с помощью моста SLF4J JUL, и он работал нормально. Проблема, с которой я столкнулся сейчас, заключается в том, что, если я использую ту же самую настройку, SLF4J жалуется на наличие дублирующих привязок SLF4J на пути к классам, и после поиска сам Glassfish содержит эти ссылки.

Как мне заставить работать SLF4J? Я попытался сделать свою зависимость от SLF4J-API как предусмотрено, а затем удалил LogBack Classic, так как glassfish уже содержит некоторый код возврата. Выполнение этих вещей не дает никаких успешных результатов.

Вальтер

2 ответа

Решение

Это может вам помочь

Скачать Glassfish 4, SLF4J и Logback

Стоп gf4

$GF_INSTALL\bin>asadmin stop-domain

а потом

копия

  • июль к SLF4J-1.7.5
  • SLF4J-апи-1.7.5
  • Logback-ядро-1.0.13
  • Logback-классик-1.0.13

в

$GF_INSTALL/ GlassFish / Библиотека / одобрила

Создать logback.xml в

$GF_INSTALL/ GlassFish / домены / domain1 / конфигурации

содержащий

<configuration debug="true" scan="true">
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>/tmp/gf_server.log</file>
        <append>true</append>
        <encoder>
            <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{52} - %msg%n</Pattern>
        </encoder>
    </appender>
    <root>
        <level value="INFO"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

изменять

$GF_INSTALL/ GlassFish / домены / domain1 / Config / logging.properties

и заменить

handlers=java.util.logging.ConsoleHandler
handlerServices=com.sun.enterprise.server.logging.GFFileHandler
java.util.logging.ConsoleHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.file=${com.sun.aas.instanceRoot}/logs/server.log
com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=0
com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1
java.util.logging.FileHandler.limit=50000
com.sun.enterprise.server.logging.GFFileHandler.logtoConsole=false
com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000
com.sun.enterprise.server.logging.GFFileHandler.excludeFields=
com.sun.enterprise.server.logging.GFFileHandler.multiLineMode=true
com.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=false
java.util.logging.FileHandler.count=1
com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0
log4j.logger.org.hibernate.validator.util.Version=warn
com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles=0
com.sun.enterprise.server.logging.GFFileHandler.rotationOnDateChange=false
java.util.logging.FileHandler.pattern=%h/java%u.log
java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter

с

handlers=org.slf4j.bridge.SLF4JBridgeHandler
handlerServices=com.sun.enterprise.server.logging.GFFileHandler
java.util.logging.ConsoleHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.file=/tmp/server.log
com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=0
com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1
java.util.logging.FileHandler.limit=50000
com.sun.enterprise.server.logging.GFFileHandler.logtoConsole=false
com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000
com.sun.enterprise.server.logging.GFFileHandler.excludeFields=
com.sun.enterprise.server.logging.GFFileHandler.multiLineMode=true
com.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=false
java.util.logging.FileHandler.count=1
com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0
log4j.logger.org.hibernate.validator.util.Version=warn
com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles=0
com.sun.enterprise.server.logging.GFFileHandler.rotationOnDateChange=false
java.util.logging.FileHandler.pattern=%h/java%u.log
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.alarms=false

Добавьте эти две новые опции JVM в

предметной области>configs->config-> Java-конфигурации

в

$GF_INSTALL/ GlassFish / домены / domain1 / конфигурации /domain.xml

<jvm-options>-Djava.util.logging.config.file=${com.sun.aas.instanceRoot}/config/logging.properties</jvm-options>
<jvm-options>-Dlogback.configurationFile=file:///${com.sun.aas.instanceRoot}/config/logback.xml</jvm-options>

затем снова запустите gf4

$GF_INSTALL\bin> стартовый домен asadmin

Если кто-то еще имеет проблемы с настроенным ch.qos.logback.core.rolling.RollingFileAppenderУ меня может быть решение для вас.

Проблема в том, что, следуя инструкциям @vzamanillo, сам logback инициализируется дважды. Это вызвано изоляцией загрузчика классов GlassFish (один раз основным ClassLoader, один раз EAR ClassLoader). Это становится видимым, если вы настраиваете debug=true, Если RollingFileAppender используется сейчас, два OutputStreams были открыты в одном и том же настроенном лог-файле. Это предотвращает удаление файла журнала во время ролловера (отображается в режиме отладки).

Чтобы исправить эту проблему, я переместил библиотеки из /modules/endorsed в /domains/domain1/lib/ext, Теперь GlassFish 4 (конкретная Payara) инициализирует logback только один раз, и все работает как положено.

Кстати: заменить JUL-логи, указав <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator" /> ОБЯЗАТЕЛЬНО, иначе вы столкнетесь с большими проблемами с производительностью.

Для отправки также регистрации потенциальных сторонних библиотек в SLF4j, не забудьте также установить jar диспетчера, а именно:

  • JCL-над-slf4j.jar
  • июль к slf4j.jar
  • log4j-над-slf4j.jar
Другие вопросы по тегам