gpt4 book ai didi

java - 为什么 Log4j 需要类名?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:25:55 26 4
gpt4 key购买 nike

为了在类中初始化 Log4j,程序员需要提供 Class 实例(或表示它的字符串名称)。代码将如下所示:

public class MyClass {
private static Log logger = Logger.getLogger(MyClass.class);
[...]
}

Log4j 然后会根据程序员给定的参数提供输出。输出看起来像这样:

[INFO] [MyClass:124] Foobar

我的问题:如果 Log4j 知道日志语句的行号是多少(124),那么它为什么需要类名(我的类(class))?在我看来,如果它能弄清楚前者,它应该能弄清楚后者。

编辑:这也不是一个无意义的问题;我们大多数人都见过这样的代码:程序员不小心复制并粘贴了另一个类的初始化代码,但忘记在初始化程序中更改类名。这会导致 Log4j 提供令人困惑的输出。

(当然,我的问题并没有说明具体问题,但它有助于我理解 Log4j 和可能的 Java 反射的工作原理)。

最佳答案

In order to initialize Log4j within a class, the programmer needs to provide the Class instance (or a string name which represents it).

不,不需要使用类名 - 这只是约定俗成,这样您就可以通过类名和包名配置日志记录。你也可以使用

private static Log logger = Logger.getLogger("SomeUniqueName");

在记录时间检索到的类名和行号很可能是通过当前线程的 StackTrace 检索到的,这是一个性能瓶颈 - 请参阅 http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html .

例如,对于 L 模式,它表示

WARNING Generating caller location information is extremely slow and should be avoided unless execution speed is not an issue.

抛开检索堆栈跟踪的性能,从技术上讲,以下内容也可以在不显式引用类的情况下检索静态和实例记录器(可能需要一些更复杂的错误处理,尤其是使用数组访问):

public class ClassLogger {
public static Logger getLogger() {
String className = Thread.currentThread().getStackTrace()[2].getClassName();
return Logger.getLogger(className);
}
}

这可以像这样使用

public class SomeClass {
private static Logger sl = ClassLogger.getLogger();
private Logger il = ClassLogger.getLogger();

...

这也适用于非 Debug模式,因为在这种情况下类名也可用(但文件名和行号不可用)。

关于java - 为什么 Log4j 需要类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21443223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com