2

合理的

我想在几个超类上有更详细的日志调试/日志输出,因此子类名称实际上不会影响实时性能或应用程序逻辑。我也认为正常执行此操作是相当糟糕的设计,但是我确实希望在开发运行期间记录此信息。

问题

假设我有一个简单的类结构,如下所示,如何将子类的名称拉入超类而无需显式传递引用?

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...
    }
}

我以前曾使用过解析堆栈跟踪,我怀疑如果我想要这些信息,我必须走这条路。有谁知道可以为我做这件事的库或一个好的代码片段?

4

3 回答 3

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...
}
于 2009-04-16T06:48:06.777 回答
6

执行此行时,您已经获得了该信息:

private Logger logger = LoggerFactory.getLogger(getClass());

这意味着您将使用实际课程的类别进行记录。由于该信息已经在日志中,我认为将其包含execute方法中没有多大意义。只需确保您的日志输出格式包含类别名称就可以了。

于 2009-04-16T06:53:15.313 回答
4

为什么要显式记录类名。Log4j 已经这样做了。您定义 Logger 的方式将起到作用。检查您的日志文件。

于 2009-04-16T06:51:47.533 回答