Например, вместо:
Код: Выделить всё
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!");
}
}
< /code>
Я хотел бы сделать что -то вроде этого: < /p>
import my.utils.LogUtils;
public class Main {
public static void main(String[] args) {
LogUtils.info("Application started!");
}
}
Код: Выделить всё
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]; }
}
< /code>
Я прочитал несколько страниц документации log4j2, но я ничего не нашел в отношении своего вопроса, и я также проверил несколько вопросов переполнения стека, но, похоже, что я пытаюсь искать, что приводит к совершенно другому вопросу. < /p>
это даже возможно? Потому что я начинаю сомневаться в этом. Обознайте, что я пытаюсь избежать использования регистратора в классе ... Я бы не стал задавать вопрос иначе. По крайней мере, возможно создать пользовательский журнал, который регистрирует пользовательский уровень трассировки стека?
org.apache.logging.log4j
log4j-api
2.14.1
org.apache.logging.log4j
log4j-core
2.14.1
< /code>
Я также должен упомянуть, что, в ответ, есть этот вызов: < /p>
LOG.log(LoggingHelper.class.getCanonicalName(), Level.INFO, message, null);
Код: Выделить всё
Logger#log(String, Level, Object, Throwable);
Подробнее здесь: https://stackoverflow.com/questions/691 ... ng-the-log