public class SessionLogger {
private final String sessionId;
public SessionLogger(String sessionId) {
this.sessionId = sessionId;
}
public void info(Log log, String message, Object... args) {
log.info(formatMessage(message, args));
}
public void error(Log log, String message, Throwable t, Object... args) {
log.error(formatMessage(message, args), t);
}
private String formatMessage(String message, Object... args) {
for (int i = 0; i < args.length; i++) {
message = message.replaceFirst("\\{\\}", args[i].toString());
}
return String.format("SessionId [%s]: %s", sessionId, message);
}
}
Что я хочу сделать, это передать экземпляр Logger в класс SessionLogger, и я хотел бы увидеть имя класса, в котором был инициализирован Logger.Pass Logger как аргумент другому классу
public class A {
private static final Log log = LogFactory.getLog(A.class)
public void doIt() {
sessionLogger.info(log, "hello world");
}
}
я бы ожидал увидеть класс А в журнале сообщений вместо SessionLogger:
2013-10-07 00:29:27,328 INFO [main] (SessionLogger.java:17) - SessionId [123]: Hello world
Я Викисклада logging.jar и log4j-1.2.16.jar в пути к классам. Logger является экземпляром org.apache.commons.logging.Log
Update
Просто выпустили, что ожидаемое поведение, вызвать Logger
регистрирует строчку кода, где был вызван метод журнала. Так оно и должно быть сделано по-другому как-то
>> заставляет Logger записывать строку кода, где был вызван метод журнала <<. , , Это зависит от конфигурации вашего log4j.properties - вы также можете вывести имя регистратора (которое должно быть «A») – cljk
Да. Но было бы неплохо также записать строку кода. Поскольку log4j вызывает Thread.currentThread(). GetStackTrace() ..., чтобы получить номер строки во время выполнения, я не могу использовать этот подход в этом случае – user12384512