2

我知道这个问题的标题有点生硬,我越是试图在一个单一的陈述中说清楚,我就越不成功。无论如何,在一个 Web 应用程序项目中,我需要使用 Log4j 记录每个操作(以及其中发生的错误),项目中有数百个类,我想避免每个类都有一个 Logger 对象。记录所需的级别是 ERROR。因此,我想到了一个自定义类,其中包含一个处理 Logger 对象的“error()”方法的静态方法。如下所示:

public class LoggerUtil {

    public static void error(String message, Object classObject) {
        String className = classObject.getClass().getName();
        Logger logger = LogManager.getLogger(className);
        logger.error(message);
    }
}

因此,每当在项目中的任何位置调用“LoggerUtil.error(message, this.getClass().getName())”时,我们都可以通过当前类的相关记录器记录一些内容。问题是这似乎不起作用,我想不可能实例化与另一个类中的特定类相关的记录器。当我们的 LoggerUtil.error() 在一个类中被调用时,给出的错误日志显示一个不相关的类作为它的源 (java.lang.String)。我想知道是否有办法使这个想法生效?

[更新]:问题解决了。设计中出现问题,以这种方式解决:

public class LoggerUtil {

    public static void error(String message, String className) {
        Logger logger = LogManager.getLogger(className);
        logger.error(message);
    }
}

第二个参数已更改为 String,因此类名直接传递给方法。记录器现在工作正常。

4

1 回答 1

1

您的方法需要一个对象作为参数,并获取该对象的类以获取适当的记录器。

但是当你调用你的方法时,你调用它

LoggerUtil.error("Error", this.getClass().getName());

因此,作为参数传递的不是要记录的对象(即 CustomClass 实例),而是其类 ( "com.foo.CustomClass") 的名称,它是一个字符串。在该方法中,您只需向记录器询问对象类的名称"com.foo.CustomClass",即 java.lang.String。

简而言之,您将两次获得对象类的名称:一次在调用者中,一次在被调用方法中。

所以,把你的电话改成

LoggerUtil.error("Error", this);

你会得到想要的结果。

于 2013-10-31T16:01:47.117 回答