Перенаправить логирование JUL из Джерси в Log4j2

Мне нужно перенаправить журнал запросов / ответов Джерси на мой log4j2.

У меня включено ведение журнала Джерси с помощью этого кода на моем ApplicationJAXRS extends Application:

@Override
public Set<Class<?>> getClasses() {
    return new HashSet<Class<?>>() {{
        add(LoggingFilter.class);
    }};
    }

Кажется, что Джерси использует JUL (ведение журнала Java) внутри, а вывод по умолчанию - STDOUT. В этот момент я вижу STDOUT на консоли Eclipse.

В документации Log4j2 есть раздел об адаптере журналирования JDK. Это говорит

Чтобы использовать адаптер ведения журнала JDK, необходимо установить для системного свойства java.util.logging.manager значение org.apache.logging.log4j.jul.LogManager.

Это необходимо сделать либо через командную строку (т. Е. С помощью аргумента -Djava.util.logging.manager = org.apache.logging.log4j.jul.LogManager) или с помощью System.setProperty () перед выполнением каких-либо вызовов LogManager или Logger.

Чтобы вызвать System.setProperty(*) перед любым вызовом Logger, я попытался поместить его в @PostConstruct в моем классе Aplication.

@PostConstruct
    public void init() {
        System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
    }

Я мог бы заставить его входить в мои файлы журналов.

Это мой log4j2.xml:

    <Appenders>
        <RollingFile name="RollingFile" fileName="${log-path}/${name}.log" 
            filePattern="${log-path}/${date:yyyy-MM}/${name}-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>%d{dd-MM-yy HH:mm:ss,SSS} %-5p [%t] (%F:%L) - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="10" />
        </RollingFile>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" level="debug"/>
            <AppenderRef ref="RollingFile" level="debug"/>
        </Root>
    </Loggers>
</Configuration>

person Cássio    schedule 20.03.2015    source источник


Ответы (2)


Я предполагаю, что вам нужно установить системное свойство при запуске. Добавьте код в свой метод инициализации, чтобы проверить, сработала ли установка системного свойства.

@PostConstruct
public void init() {
    String cn = "org.apache.logging.log4j.jul.LogManager";
    System.setProperty("java.util.logging.manager", cn);
    LogManager lm = LogManager.getLogManager();
    if (!cn.equals(lm.getClass().getName())) {
       try {
           ClassLoader.getSystemClassLoader().loadClass(cn);
       } catch (ClassNotFoundException cnfe) {
          throw new IllegalStateException("Jars not in system class path.", cnfe);
       }
       throw new IllegalStateException("Found " + lm.getClass().getName() + " set as launch param instead.");
    }
}
person jmehrens    schedule 20.03.2015
comment
@jmehres ty за помощь. - person Cássio; 23.03.2015
comment
java.lang.IllegalStateException: был сгенерирован java.util.logging.LogManager. - person Cássio; 23.03.2015
comment
Это означает, что установка системного свойства в init не работает, потому что были созданы регистраторы. - person jmehrens; 23.03.2015
comment
Пытался добавить -Djava.util.logging.manager = org.apache.logging.log4j.jul.LogManager в параметры инициализации Tomcat. Выдает исключение java.lang.ClassNotFoundException: org.apache.logging.log4j.jul.LogManager - person Cássio; 23.03.2015
comment
Log4j не должен находиться на пути к системному классу. - person jmehrens; 23.03.2015
comment
log4j-api-2.2.jar, log4j-core-2.2 и log4j-jul-2.2 находятся в TOMCAT / lib и в пути к классам приложения. - person Cássio; 23.03.2015
comment
Настроил путь к классам tomcat, и он работает, но в моем случае я не могу изменить сервер, поэтому мне нужно решение для приложения. В любом случае, спасибо! - person Cássio; 23.03.2015
comment
@ Cássio Где вы можете решить эту проблему? Вы можете поделиться своими выводами? - person Akshay Gundewar; 31.07.2015
comment
@GAkshay, к сожалению, я не продвинулся. - person Cássio; 31.07.2015
comment
@GAkshay по этой ссылке может быть ответ, который вы ищете (не касаясь конфигурация сервера). Это не общепринятый ответ, а еще один (просто предупреждение). - person Turik Mirash; 31.01.2018

Это действительно работает для случая Джерси, хотя вам все равно нужно установить свойство System java.util.logging.manager = org.apache.logging.log4j.jul.LogManager

Создайте экземпляр своего регистратора как обычно для log4j2 для общего ведения журнала приложений. Затем явно создайте экземпляр java.util.logging.Logger, используя org.apache.logging.log4j.jul.LogManager. Этот второй экземпляр Logger затем используется для регистрации нового LoggingFilter, как можно увидеть здесь, используя клиент Jersey 2 для этого примера (подробное наименование для ясности):

org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(this.getClass().getName());

java.util.logging.Logger jerseyLogger = org.apache.logging.log4j.jul.LogManager.getLogManager().getLogger(this.getClass().getName());

jerseyLogger.setLevel(java.util.logging.Level.SEVERE); //OPTIONAL

Client client = ClientBuilder.newClient();
client.register(new LoggingFilter(jerseyLogger, false));

logger.info("App logging uses the normal logger");

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

person Francis Brennan    schedule 21.10.2015
comment
LoggingFilter устарел с версии 2.23 и заменен на LoggingFeature :) - person Artem; 10.02.2017