log4j не отображается в кросс-проектном приложении? - PullRequest
1 голос
/ 22 ноября 2011

Введение: У меня есть несколько проектов: proj-a, proj-b, proj-c и т. Д. Эти проекты связаны через их pom.xml в зависимостях.

Теперь моя проблема заключается в следующем: proj-a - основной каркасный проект, в котором есть все общее во всех проектах. Таким образом, мой обработчик статического журнала содержится в этом проекте. На него теперь ссылается proj-b, и обработчик журнала доступен, но каждый раз, когда я пытаюсь что-то записать, он не записывает в указанный файл или в консоль. Я знаю, что моя конфигурация верна, так как я попытался создать тест junit на proj-a и проверил обработчик журнала, он выводит то, что мне нужно для вывода, журнал в файле и отображение консоли.

Пример кода proj-b:

public class TestServicePublisher {

    public static void main(final String[] args) {
        //  System.out.println("Test Service started.");
        //  Endpoint.publish("http://localhost:8080/cas-service", new TestService());
        LogHandler.logDebug(TestServicePublisher.class, "main", "Starting Login Service");
        Endpoint.publish("http://localhost:8080/cas-service/login", new LoginService());
    }

}

и образец logHandler в proj-a выглядит следующим образом:

public static String logDebug(Class clazz, String methodName,
        Integer messageCode, List<String> messageAttributes) {
    List<String> classMethodAttributes = createClassMethodAttributes(clazz,
            methodName);
    String message = retrieveMessage(messageCode, messageAttributes,
            classMethodAttributes);
    Logger logger = Logger.getLogger(clazz);
    logger.debug(message);
    return message;
}

proj-a содержит файл jar log4j, а также файл log4j.xml.

Ответы [ 3 ]

0 голосов
/ 22 ноября 2011

Я подозреваю, что это проблема с classpath и загрузчиком классов.Ваш файл конфигурации log4j находится в jar-файле, встроенном в проект A. Проект B содержит файл jar из проекта A в своем пути к классам вместе с файлом log4j.jar.Когда ваш основной класс пытается инициализировать систему log4j, он использует загрузчик классов вашего основного класса, чтобы найти файл конфигурации log4j, но не может его найти, поэтому вы должны получить ошибки, напечатанные в stderr, например:

log4j: ПРЕДУПРЕЖДЕНИЕ Для регистратора не найдено ни одного дополнительного устройства.

log4j: ПРЕДУПРЕЖДЕНИЕ. Пожалуйста, правильно инициализируйте систему log4j.

Чтобы проверить этоУстановите файл конфигурации явно, используя системное свойство log4j.configuration.

0 голосов
/ 23 ноября 2011

Теперь у меня есть решение моих проблем.Я перепроверил все POM, которые у меня есть во всех проектах, и нашел еще один экземпляр зависимостей log4j от projectC.

По-видимому, это произошло с slf4j и slf4j-jdk, поэтому я вижу журналы информационного уровня, которые совпадают с примером здесь в руководстве slf4j.После удаления этих зависимостей из POM я смог без проблем запустить основные методы в любом из связанных проектов.

Также я получал отладочную информацию, когда выполнял junits или основные методы в projectA, потому чтоэто не зависело ни от какого другого проекта, что означает, что он не включал slf4j и slf4j-jdk.

0 голосов
/ 22 ноября 2011

Почему бы вам не установить файл во время выполнения вместо того, чтобы устанавливать его в файле конфигурации.

В коде:

System.setProperty("file.name","your path"); 

В файле конфигурации log4j:

log4j.appender.appender_name.File = ${file.name}

Другой метод заключается в использовании в коде функции setFile (String fileName) и установке имени файла во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...