为什么log4j的Logger.getLogger()需要传递一个Class类型?

时间:2013-01-30 04:27:37

标签: java log4j

我阅读了一些关于如何使用log4j的文章。 他们中的大多数都将以下代码作为开头:

 Logger logger = Logger.getLogger("com.foo.Bar");

 Logger logger = Logger.getLogger(XXX.class);

这将初始化logger对象。但我的问题是为什么需要将类类型作为参数发送?看来当我使用记录器时,我并不关心我在哪个类中使用它。所以Class类型似乎对记录器没有影响。 如果我将一个logger声明为static和public,我可以在另一个类中调用这个logger,那么作者有意这样设计它吗?当我使用记录器时,Class类型会绑定一些东西吗?或者我可以将任何类类型发送到getLogger函数。

8 个答案:

答案 0 :(得分:55)

  1. 您始终可以使用任何字符串作为类型以外的记录器名称。这绝对没问题。

  2. 许多人使用班级类型的原因,我想:

    • 易于使用。您无需担心复杂Java EE应用程序中的记录器名称重复。如果其他人也使用您的记录器名称,您可能会有一个日志文件,不仅包括您的类的输出;

    • 易于检查日志记录类,因为记录器名称将显示在日志文件中。您可以快速导航到特定的课程;

    • 当您分发课程时,人们可能希望将您的课程中的日志记录重定向到特定文件或其他位置。在这种情况下,如果您使用特殊的记录器名称,我们可能需要检查源代码,或者如果源不可用则无法执行此操作。

答案 1 :(得分:8)

来自javadocLogger.getLogger(Class)getLogger(clazz.getName())的简写。与log4j和其他日志框架一起使用的约定是为每个类定义一个静态记录器。例如,

public class SomeClass {
    private static final Logger LOG = Logger.getLogger(SomeClass.class);
    ...
}

我发现这个约定适用于组织日志输出。这当然不是必需的,但是是一种有用的做法。

答案 2 :(得分:6)

1:在log4j.properties中定义之前,可以使用“类名”或“字符串名称”, 比如

log4j.logger.anything=INFO,anything

因此,您可以将日志记录为

 Logger logger = Logger.getLogger("anything");

2:如果你定义了一些日志名称,你可以很容易地检查它,因为它们是分开的。

答案 3 :(得分:0)

XXX.class是命名您的记录器,即标记后续日志语句。 让您了解某些日志语句属于/来自哪个类。

答案 4 :(得分:0)

带有类名的记录器不是必需的,您可以使用自己的消息。通常使用:

Logger logger = Logger.getLogger(XXX.class) 

并且对调试很有用。它将记录执行哪行代码。

答案 5 :(得分:0)

它可以依赖于特定的日志记录库,但是通常它不仅仅是一个名称。它表示记录器的层次结构。 配置记录器时,通常会同时传递“日志级别”和“记录器”名称,如下所示:

<logger name="org.hibernate" level="ALL"/>

此属性不仅是名称,还意味着层次结构。如果相反,您将编写如下内容:

<logger name="org" level="ALL"/>

不仅休眠,而且org包中的所有内容都将受到影响。 另一方面,如果您编写如下内容:

<logger name="org.hibernate.validator" level="ALL"/>

它只会涉及休眠验证程序包,而不涉及其余的休眠状态。

顺便说一句,如果您不想为每个工厂指定具体的类,则可以使用something like(Kotlin):

val logger: Logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())

答案 6 :(得分:0)

尝试使用getName()方法。

private static final Logger log = LogManager.getLogger(JwtAuthenticationFilter.class.getName());

答案 7 :(得分:-1)

您可以按类类别跟踪日志。

例1:

public class Bar {
    Logger logger = Logger.getLogger("com.foo.Bar");
    ...
    logger.debug("debug message");
}

也许你可以在下面看到一条日志消息。

DEBUG: **com.foo.Bar** debug message

例2:

public class Foo {
    Logger logger = Logger.getLogger("com.foo.Foo");
    ...
    logger.debug("debug message");
}

也许你可以在下面看到一条日志消息。

DEBUG: **com.foo.Foo** debug message

如果你有很多java类和记录器消息,那么找到日志消息的位置就太难了。