В Log4J API о Logger.log (String callerFQCN, уровень приоритета, сообщение объекта, Throwable t):
Параметры:
- callerFQCN - Полное имя класса класса-оболочки.
- level - уровень запроса на регистрацию.
- message - сообщение о запросе на регистрацию.
- t - Выбрасываемый запрос на регистрацию может быть нулевым.
См .: Log4J API .
Довольно странно, я знаю, аргумент называется "callerFQCN", который выглядит как класс объекта вызывающей стороны, НО (muajaja!) На самом деле это класс "оболочки" (например, MyClass.class.getName ()).
На самом деле, я думаю, что вызывающий абонент получает аргумент Throwable. Не уверен, не проверял реализацию.
Когда вы оставите аргумент Throwable пустым, я думаю, что-то подобное должно происходить ниже:
StackTraceElement[] stack = (new Throwable()).getStackTrace();
String caller = stack[something, meaby 1].getClassName();
Если вы хотите создать оболочку Logger, вам нужно сделать что-то вроде этого:
public static void myWarn(String message) {
myLogger.log(MyWrapper.class.getName(), message, Level.WARN, null);
}
Эта работа без проблем в качестве обёртки.
Или, если вам абсолютно необходимо поддерживать интерфейс, который вы показываете ниже, сделайте что-то вроде этого:
// Warning: Pseudocode
public static void myWarn(Object source, String message) {
String sourceClass = source.class.GetName();
StackTraceElement[] stack = (new Throwable()).getStackTrace();
stack[1, or meaby 2... or 0?] = new whatever(sourceClass);
myLogger.log(MyWrapper.class.getName(), message, Level.WARN, myStack);
}
Надеюсь, это поможет.