Logback + SLF4J не входит в приложение JavaEE 7 - PullRequest
0 голосов
/ 08 июня 2018

Я создаю простое приложение, и теперь я сталкиваюсь с «кошмаром журналирования» в приложении 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.
my 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 is 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.

1 Ответ

0 голосов
/ 09 июня 2018

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

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

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

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

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

...