Logback + SLF4J не выполняет вход в приложение JavaEE 7

Я создаю простое приложение, и теперь я столкнулся с «кошмаром журналирования» в приложении javaee. Я провел несколько дней поисков, сотни изменений / тестов, но нет никакого способа заставить его работать. Мое приложение состоит из простого

  EAR
   +-- /lib
   |     +-- slf4j-api-1.7.25.jar
   |     +-- logback-classic-1.2.3.jar
   |     +-- logback-core-1.2.3.jar
   |
   +-- JAR (JPA/EJB/Producers/Interceptors)
   |    +--src/main/resources
   |        +-- logback.xml
   |        +-- logback-test.xml
   |
   +-- WAR

Библиотеки загружаются в каталог lib файла EAR.
мой pom.xml в проекте EJB содержит следующие зависимости:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

есть также javaee-api-7.0, как предусмотрено. Я помещаю средство ведения журнала в проект EJB, поэтому я могу использовать производителя журнала в веб-приложении и внедрить средство ведения журнала также в контроллеры JSF. logback.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <property name="DEV_HOME" value="c:/Dev" />

    <appender name="FILE-AUDIT"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEV_HOME}/debug.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>WE:%d{yyyy-MM-dd HH:mm:ss} - %msg%n</Pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>${DEV_HOME}/archived/debug.%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <logger name="it.univaq.we2018" level="DEBUG" additivity="false">
        <appender-ref ref="FILE-AUDIT" />
    </logger>

    <root level="ERROR">
        <appender-ref ref="FILE-AUDIT" />
    </root>
</configuration>

Все мои классы находятся в пакете it.univaq.we2018 (.service, .controllers, ....). Вот производитель CDI (System.out используется только для моих целей):

@Named
@Singleton
public class LoggerProducer {
    @Produces
    public Logger produceLogger(InjectionPoint ip) {
        System.out.println("-----> construct logging for: "+ip.getMember().getDeclaringClass());
        Logger log = LoggerFactory.getLogger(ip.getMember().getDeclaringClass());
        System.out.println("-----> LogFactory is: "+log+" for "+log.getName()); 
        return log;
    }
}

Это EJB, в котором он используется:

@Stateless
@LocalBean
public class SecurityService implements Serializable {
    @Inject
    Logger log;

    public boolean performSecurityCheck(String userName, String target) {        
        log.debug("Testing ["+target+"] for user ["+userName+"]...");
        return true;
    }
}

Пакет Logger и LoggerFactory - org.slf4j
Пытался переместить logback.xml в каждую папку / пакет ... ничего такого. Вывод всегда один и тот же:

INFORMAZIONI:   indexController.init() INFORMAZIONI:   ---- ENTER:
[it.univaq.we2018.tutor.controller.IndexController.doAction()]

INFORMAZIONI:   -----> construct logging for: class
it.univaq.we2018.tutor.service.SecurityService

INFORMAZIONI:   -----> LogFactory is: 
Logger[it.univaq.we2018.tutor.service.SecurityService]
for it.univaq.we2018.tutor.service.SecurityService

INFORMAZIONI:  10:38:34.423 [http-thread-pool::http-listener-1(4)] DEBUG
it.univaq.we2018.tutor.service.SecurityService - Testing
[it.univaq.we2018.tutor.controller.IndexController.doAction()] for
user [null]...

INFORMAZIONI:   indexController.doAction() INFORMAZIONI:  
BaseService.businessMethod() INFORMAZIONI:   ---- EXIT: 
[it.univaq.we2018.tutor.controller.IndexController.doAction()]

Строка журнала №4 - это строка, которая должна перейти к файлу, но файл никогда не открывается, а формат журнала не соответствует конфигурации (должен начинаться с префикса WE: и иметь другой шаблон. ). Я не знаю, как это исправить. Я всегда думал, что ведение журнала приложения JavaEE требует полной переработки с нуля: сервер приложений должен предоставлять механизм «плагинов», такой как источник данных, который уменьшает все проблемы, связанные с конфигурацией, загрузкой классов, конфликтами библиотек и т. Д.

Работает в NetBeans 8.2, проект архетипа maven javaee7, Java 1.8_172 под Payara 5.182.


person crick77    schedule 08.06.2018    source источник


Ответы (1)


У вас проблема с видимостью ресурса.

Jar-файлы в каталоге EAR / lib не могут видеть классы или ресурсы в JAR-файлах EJB или WAR-файлах. Ваша конфигурация в настоящее время находится в модуле EJB. Поэтому классы возврата в каталог EAR / lib не могут видеть файлы конфигурации.

Если вы должны упаковать конфигурацию ведения журнала, она должна быть в банке в каталоге EAR / lib, чтобы ее можно было найти.

Дополнительную информацию о видимости ресурсов и классов в файле EAR можно найти в моем ответе на Мое ухо не может найти классы модулей ejb.

Лично я предпочитаю внешнюю конфигурацию журналирования. В случае возврата вы можете указать путь к файлу конфигурации, используя переменную среды -Dlogback.configurationFile=/path/to/config.xml.

person Steve C    schedule 09.06.2018
comment
Спасибо за помощь! Перенесли библиотеки логбэка в другой JAR и включили в проект. Запустив его, посмотрел в файле ebj-jar (увидел сообщение в журнале Payara). Итак, я просто переместил файл logback.xml в META-INF файла ejb-jar и вуаля .. все началось! - person crick77; 10.06.2018