当前位置: 首页 > 面试题库 >

如何在多个类中使用log4j?

养星汉
2023-03-14
问题内容

我目前正在用Java编写一个大型项目,其中包含许多类,有些类很小,只用很少的方法表示对象。我的主班有一个记录器,它运行良好。我希望所有类只能使用一个记录器(带有一个控制台附加程序)。我试图将对记录器的引用传递给不同的类,但是看起来不正确。此外,有时我在不运行main的情况下在类上运行测试,因此未针对其他类初始化记录器。

我的意思是,如何做到这一点的最佳方法是如何从不同的类登录到一个日志,而各类之间没有硬性依赖关系,并且能够对每个类独立使用日志?


问题答案:

如果我理解正确,那么您现在的情况是:

public class Main {
    public static final Logger LOGGER = Logger.getLogger(Main.class);
}

public class AnotherClass {
    public void doSomething() {
        Main.LOGGER.debug("value=" + value);
    }
}

或者,您将对记录器的引用传递到类的构造函数中。

首先,您可以通过简单地使用传递给Logger.getLogger的相同值来使用一个全局记录器,例如:

public class Main {
    private static final Logger LOGGER = Logger.getLogger("GLOBAL");
}

public class AnotherClass {
    private final Logger LOGGER = Logger.getLogger("GLOBAL");

    public void doSomething() {
        LOGGER.debug("value=" + value);
    }
}

这使用完全相同的记录器,Logger.getLogger在两个调用中返回相同的对象。您不再在类之间具有依赖关系,这将起作用。

我从评论中收集到的另一件事是,您正在手动配置(使用
BasicConfigurator.configure。大多数情况下,这不是必需的,您应该通过将log4j.properties或log4j.xml添加到类路径中来进行配置。在Eclipse中,可以通过将其添加到src
/(如果使用maven,则将其添加到src / main / resources)中来完成;如果使用的是junit,则将其添加到test
/源目录(或将src / test / resources与maven)。这是配置log4j的长期更好的方法,因为您不必在类之间传递信息。


另外,推荐使用记录器的方法是将类传递给Logger.getLogger()。这样,您可以根据类名称过滤输出,这通常比仅使用一个全局记录器有用得多:

public class Main {
    private static final Logger LOGGER = Logger.getLogger(Main.class);
    public static final main(String[] args) {
        LOGGER.debug("started");
    }
}

public class AnotherClass {
    private final Logger LOGGER = Logger.getLogger(this.getClass());

    public void doSomething() {
        LOGGER.debug("value=" + value);
    }
}

然后,在log4j.properties中,可以为一个文件配置一个附加程序。

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

最后,没有必要将所有记录器声明为静态。仅当您要进行 大量
[*]对象创建时,这才有明显的不同。将记录器声明为非静态字段可让您使用,Logger.getLogger(this.getClass());在这种情况下,将记录器添加到类中将成为单行的剪切和粘贴。此slf4j页包含了有关优缺点的详尽说明。因此,除非您有充分的理由不这样做,否则请使用非静态字段。

Cameron说对了,他说您应该尝试并尽可能使用slf4j,它是一个杀手级功能,可以与它一起使用多个日志记录框架,这是正确的。

[*]我的意思是很多。



 类似资料:
  • 我有一个使用RabbitMQ(spring-boot-starter-amqp)的Spring应用程序。 我想知道是否可以跨不同的类使用RabbitListener注释。 我目前有两个类:和 <代码>接收器。java: : RabbitMqConfig。java: 当我使用RabbitMQ管理工具向FanoutExchange发布消息时,类中的不会将任何内容记录到控制台。但是,如果此方法在类中,则

  • 问题内容: 使用css-in-js方法将类添加到React组件,如何添加多个组件? 这是class变量: 这是我的用法: 上面的作品,但有没有办法添加两个类,而无需使用npm包?就像是: 问题答案: 您可以使用字符串插值:

  • 问题内容: 所以我正在一个项目中,我想要一个包含多个数据流的列表视图。我正在寻找的是这样的东西,但是所有这些都需要在一个列表视图中滚动。 我正在接收的数据流来自firebase,并且该变量是firebase集合的实例。我能够为单个流构建一个列表,所以我知道实例是正确的,我不想共享它,因为当前数据库规则处于测试模式。 此代码使我可以从单个流构建单个对象,并且可以按预期工作。 从这里开始,我觉得我有2

  • 但我得到了NullPointerException任何人都可以帮忙

  • 问题内容: 我有几个模块-假设是server.js,module1.js,…,moduleN.js。 我想在server.js中定义日志文件: 然后在我所有的模块中使用它 最好的方法是什么?我可以在每个模块中,然后在server.js中进行设置,但是还有更好的解决方案吗? 先感谢您! 问题答案: 默认的记录器概念很好地解决了这一问题。 Winston定义了一个默认记录器,任何对Winston的直接

  • 我有一个负载平衡器,我想测试负载平衡器的性能。我使用Apache JMeter来测试负载平衡器。我需要更改我的IP地址,以便客户端IP总是不同的。我的uni不允许我添加多个IP地址(IP欺骗/ IP别名)。 所以,另一个选择是使用代理服务器。有没有办法一次在JMeter中使用2个或多个代理服务器?目前我只能一次指定一个代理服务器。 有办法扭转局面吗?