当前位置: 首页 > 知识库问答 >
问题:

如何在Log4j中的静态方法中实例化记录器(对于大型项目)?

龙志勇
2023-03-14

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

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())”时,我们都能够通过当前类的相关记录器记录一些内容。问题是,这似乎不起作用,我想不可能在另一个类中实例化与特定类相关的记录器。当我们吵架的时候。在一个类中调用error(),给出的错误日志显示一个不相关的类作为其源(java.lang.String)。我想知道有没有办法让这个想法奏效?

【更新】:问题解决。设计中出现问题,以这种方式修复:

public class LoggerUtil {

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

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

共有1个答案

白文彬
2023-03-14

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

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

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

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

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

所以,把你的电话换成

LoggerUtil.error("Error", this);

你会得到想要的结果。

 类似资料:
  • 我有以下代码: 到目前为止,代码还可以,但我无法在主方法中实例化'in',比如,因为它显示

  • 问题内容: 我有以下代码: 到目前为止,代码还不错,但是我无法像显示的那样在main方法中实例化 我该怎么做?我不想使我的课堂静止。 问题答案: 你还必须参考其他外部类。 如果内在是静态的,那将是

  • 我有一个并发运行代码,每次运行都需要在文件中记录一些内容。每个执行-新的故事与唯一的文件。 事先谢谢你,安德烈!

  • 问题内容: 以下是有关如何使Java通用类将单个项目附加到数组的代码段。如何使appendToArray成为静态方法。在方法签名中添加static会导致编译错误。 问题答案: 您唯一可以做的就是将您的签名更改为 重要细节: 返回值之前的泛型表达式始终会引入(声明)新的泛型类型变量。 另外,类型()和静态方法()之间的类型变量永远不会相互干扰。 因此,这意味着什么:如果方法不是,则我的答案将隐藏。A

  • 我试图在静态方法中模拟静态方法。 我想知道不使用任何框架是否可能。 有没有办法达到我的目的?

  • 问题内容: 我需要在实用工具类中添加带有静态方法的方法,该方法可以解析JSON字符串中的内容并返回内容数组。 问题是这些东西有各种子类型,因此我创建了此方法: 呼叫者如何告诉该方法是什么?还是有更好的方法来做到这一点? 问题答案: 您需要通过它。 泛型在很大程度上是编译时的功能。这意味着它在运行时不可用(某些例外) 在这种情况下,要使泛型类型在运行时可用,必须将其作为附加参数传递。