Использование log4j2 из утвержденных директорий - PullRequest
0 голосов
/ 29 июня 2018

Мой пример кода так прост:

import org.apache.log4j.Logger;
public class Test {
    public static void main(String args[]){
        LOG.info("information log line");
    }
    private final static Logger LOG = Logger.getLogger(Test.class);
}

Он компилируется и работает нормально с log4j 2.11.0.

Для проекта, использующего jacORB, мне нужно поместить файлы jar log4j log4j-core-2.11.0.jar и log4j-api-2.11.0.jar в каталог, который добавляется в приложение через -Djava.endorsed.dirs=someDir. Поэтому, когда я копирую log4j-jars в подкаталог edDir и запускаю приведенный выше пример с

java -Djava.endorsed.dirs=edDir -Dlog4j.configurationFile=log4j.xml Test

Это заканчивается этим выводом:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.apache.log4j.Logger.getLogger(Logger.java:41)
    at Test.<clinit>(Test.java:7)
Caused by: java.lang.NullPointerException
    at org.apache.logging.log4j.util.LoaderUtil.getClassLoaders(LoaderUtil.java:115)
    at org.apache.logging.log4j.util.ProviderUtil.<init>(ProviderUtil.java:66)
    at org.apache.logging.log4j.util.ProviderUtil.lazyInit(ProviderUtil.java:146)
    at org.apache.logging.log4j.util.ProviderUtil.hasProviders(ProviderUtil.java:130)
    at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:89)
    ... 2 more

Раньше работал с log4j 2.6. Описанная выше ошибка произошла после обновления до log4j 2.11.0.

Я что-то не так делаю? Как я могу сделать эту работу снова?

Кстати, JRE составляет 1,7.

Ответы [ 3 ]

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

Просто соберите свой проект в eclipse, используя приведенный выше пример (log4j-core-2.11.0.jar и log4j-api-2.11.0.jar) - вам нужно изменить операторы импорта и изменить Logger на LogManager:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;



public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        LOG.info("information log line");
    }
    // private static final ExtLogger logger = ExtLogger.create(MyService.class);
    private final static Logger LOG = LogManager.getLogger(Test.class);
}
0 голосов
/ 31 июля 2018

Проблема возникла, когда классы log4j были загружены загрузчиком классов Bootstrap, что является случаем, когда файлы jar log4j находятся в одобренном каталоге (-Djava.endorsed.dirs=...). Log4j не обработал это правильно (см. Трассировку стека в первом посте).

Проблема была решена в log4j 2.11.1.

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

Вы пробовали с параметром командной строки log4j.ignoreTCL = истина

Этот параметр предназначен для поиска класса во всех загрузчиках классов.

Так что-то вроде java -Djava.endorsed.dirs = edDir -Dlog4j.configurationFile = log4j.xml -Dlog4j.ignoreTCL = true Тест

...