我想在几个超类上有更详细的日志调试/日志输出,因此子类名实际上不会影响实时性能,也不会影响应用程序逻辑。我也认为通常这样做是相当糟糕的设计,但是我确实希望在开发过程中记录这些信息。
假设我有一个简单的类结构,如何将子类的名称拉入超类而不必显式传递引用?
public abstract AbstractClass {
private Logger logger = LoggerFactory.getLogger(getClass());
public AbstractClass() {}
public void execute(ContextObject context) {
if (logger.debuggingEnabled()) {
String invokingClassName = ""; // <-- how do I get this?
logger.debug("Executing {}", invokingClassName);
}
// shared application logic is here...
}
}
public MyClass extends AbstractClass {
public MyClass() {}
@Override
public void execute(ContextObject context) {
super.execute(context);
// application logic...
}
}
之前我曾经解析过堆栈跟踪,我怀疑如果我想要这些信息,那就是我必须走的路线。有没有人知道一个库会为我做这个或一个好的代码片段?
答案 0 :(得分:8)
this.getClass().getName()
不是这样做的吗?即:
public void execute(ContextObject context) {
if (logger.debuggingEnabled()) {
String invokingClassName = ""; // <-- how do I get this?
logger.debug("Executing {}", this.getClass().getName());
}
// shared application logic is here...
}
答案 1 :(得分:6)
执行此行时,您已经获得了该信息:
private Logger logger = LoggerFactory.getLogger(getClass());
这意味着您将使用实际类的类别进行记录。由于该信息已经在日志中,我认为还将其包含在execute
方法中并不合理。只需确保您的日志输出格式包含类别名称,它应该没问题。
答案 2 :(得分:4)
为什么要显式记录类名。 Log4j已经这样做了。您定义Logger的方式可以解决问题。检查您的日志文件。