Мое приложение имеет доморощенный класс входа, который я перемещаю в использование 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
В моем домашнем решении для ведения журнала использовался класс 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 управляется для каждого потока.