Печать “исходного” класса в операторе журнала с log4j оберткой

Мое приложение имеет доморощенный класс входа, который я перемещаю в использование log4j под покрытиями. Однако, так как я использую доморощенный класс для передачи остальной части положений входа приложения log4j, операторы вывода зарегистрированы как прибывающий из класса обертки вместо исходного класса.

Есть ли способ гарантировать, что "корректный" источник показывают помимо создания нового org.apache.log4j. Экземпляры регистратора для каждого оператора журнала? Я также попытался использовать Logger.log (Представьте в виде строки callerFQCN, Приоритетный уровень, Объектное сообщение, Throwable t), метод, но это, кажется, не работает, например:

public class Logger2 {

    public static org.apache.log4j.Logger log4JLogger = org.apache.log4j.Logger.getLogger(Logger2.class);

    public static void warning(Object source, String message) {

        log(source, message, Level.WARN, null)
    }

    private static void log(Object source, String message, Level level, Throwable t) {

        String className = source.getClass().getName();
        System.out.println("Logging class should be " + className);
        log4JLogger.log(className, loggingLevel, message, t);
    }
}

При вызове:

public void testWarning() {
    Logger2.warning(new Integer(3), "This should warn");
}

Печать:

Logging class should be java.lang.Integer
2010-05-25 10:49:57,152 WARN                              test.Logger2 - This should warn
7
задан Mornedhel 25 May 2010 в 15:02
поделиться

1 ответ

В моем домашнем решении для ведения журнала использовался класс log4j LocationInfo для поиска информации об исходном коде.

В этом решении объект locationInfo содержит информацию от объекта, который вызывает мой регистратор с loggerName .

Вот упрощенная версия моего регистратора, который ведет журнал с помощью log4j:

public void log(Level level, String message) {
    LocationInfo locationInfo = new LocationInfo(new Throwable(),
            loggerName);

    MDC.put(LINE_NUMBER, locationInfo.getLineNumber());
    MDC.put(FILE_NAME, locationInfo.getFileName());
    MDC.put(CLASS_NAME, locationInfo.getClassName());
    MDC.put(METHOD_NAME, locationInfo.getMethodName());
    MDC.put(FQMETHOD_NAME, locationInfo.getClassName() + "."
            + locationInfo.getMethodName());

    logger.log(level, message);

    MDC.remove(LINE_NUMBER);
    MDC.remove(FILE_NAME);
    MDC.remove(CLASS_NAME);
    MDC.remove(METHOD_NAME);
    MDC.remove(FQMETHOD_NAME);
}

Кстати: все классы Level , MDC и Logger являются классами log4j.

Ответы на комментарии:

Объект MDC хранится в объекте ThreadLocal и доступен для регистратора log4j.

Из документации MDC Java:

MDC управляется для каждого потока.

6
ответ дан 7 December 2019 в 09:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: