Как зарегистрировать вызывающего метода вместо метода, вызывающего LoggerJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как зарегистрировать вызывающего метода вместо метода, вызывающего Logger

Сообщение Anonymous »

При наличии класса утилиты ведения журнала, как регистрировать все через этот класс вместо создания объекта Logger для каждого класса?
Например, вместо:

Код: Выделить всё

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

public class Main {

private static final Logger LOG = LogManager.getLogger(Main.class);

public static void main(String[] args) {
LOG.info("Application started!");
}
}
Я хотел бы сделать что-то вроде этого:

Код: Выделить всё

import my.utils.LogUtils;

public class Main {

public static void main(String[] args) {
LogUtils.info("Application started!");
}
}
Мой класс LogUtils выглядит следующим образом:

Код: Выделить всё

package my.utils;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.HashMap;
import java.util.Map;

public final class LogUtils {

private LogUtils() {
throw new AssertionError("private constructor: " + LogUtils.class.getName());
}

private static final Map current = LogUtils.class;
LOGGERS.put(current, LogManager.getLogger(current));
}

public static void info(Object msg) {
Logger logger = getFor(getCallerClass());
// logger.info()... Here's where I am stuck! What I want to log in the stack trace is the *caller* of the "info" method, not the "info" method.
}

private static Logger getFor(Class clazz) { return LOGGERS.computeIfAbsent(clazz, key -> LogManager.getLogger(key)); }

private static Class getCallerClass() {
try {
return Class.forName(getCaller(3).getClassName());
} catch (ClassNotFoundException e) {
return LogUtils.class;
}
}

// This method should return "main" method name, but it's not being used because I don't know what should I do now
private static String getCallerMethod() { return getCaller(3).getMethodName(); }

private static StackTraceElement getCaller(int level) { return Thread.currentThread().getStackTrace()[level]; }
}
Я прочитал несколько страниц документации по log4j2, но ничего не нашел по своему вопросу, а также проверил несколько вопросов о переполнении стека, но похоже, что бы я ни пытался найти, результатом является совсем другой вопрос.
Можно ли это вообще сделать? Потому что я начинаю в этом сомневаться. Обозначьте, что я пытаюсь избежать использования Logger для каждого класса... В противном случае я бы не задавал вопрос. По крайней мере, возможно создать собственный регистратор, который регистрирует собственный уровень трассировки стека?
Кстати, мои зависимости Maven — это те, которые указаны на странице log4j2:
p>

Код: Выделить всё


org.apache.logging.log4j
log4j-api
2.14.1


org.apache.logging.log4j
log4j-core
2.14.1


Я также должен упомянуть, что в ответ идет такой звонок:

Код: Выделить всё

LOG.log(LoggingHelper.class.getCanonicalName(), Level.INFO, message, null);
Я не могу найти метод в org.apache.logging.log4j.Logger, который (например, в Javadoc) ссылается следующим образом:

Код: Выделить всё

Logger#log(String, Level, Object, Throwable);
Его просто не существует.

Подробнее здесь: https://stackoverflow.com/questions/691 ... ng-the-log
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»