【发布时间】:2013-10-13 08:48:14
【问题描述】:
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 的类名。
public class A {
private static final Log log = LogFactory.getLog(A.class)
public void doIt() {
sessionLogger.info(log, "hello world");
}
}
我希望在日志消息中看到 A 类而不是 SessionLogger:
2013-10-07 00:29:27,328 INFO [main] (SessionLogger.java:17) - SessionId [123]: Hello world
我在类路径中有 commons-logging.jar 和 log4j-1.2.16.jar。 Logger 是 org.apache.commons.logging.Log 的一个实例
更新
刚刚发布这是预期的行为,因为Logger 记录了调用 log 方法的代码行。所以应该以其他方式完成
【问题讨论】:
-
>> 导致 Logger 记录调用 log 方法的代码行
-
是的。但是记录代码行也很好。由于 log4j 调用 Thread.currentThread().getStackTrace() ... 在运行时获取行号,所以在这种情况下我不能使用这种方法
标签: java logging log4j apache-commons-logging