66

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

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

或者

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

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

4

8 回答 8

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

  2. 很多人使用类类型的原因,我猜:

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

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

    • 当您分发课程时,人们可能希望将日志从您的课程重定向到特定文件或其他地方。在这种情况下,如果您使用特殊的记录器名称,我们可能需要检查源代码,或者如果源不可用,则不可能这样做。

于 2013-01-30T05:08:44.300 回答
9

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

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

我发现这个约定可以很好地组织日志输出。这当然不是必需的,但它是一种有用的做法。

于 2013-01-30T04:35:29.623 回答
7

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

log4j.logger.anything=INFO,anything

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

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

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

于 2013-10-14T03:25:41.473 回答
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 类和记录器消息,那么很难找到日志消息的来源。

于 2013-01-30T04:46:31.453 回答
1

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

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

这个属性不仅仅是名称,它的属性意味着一个层次结构。如果相反,您会编写如下内容:

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

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

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

它只涉及休眠验证包,而不涉及休眠的其余部分。

顺便说一句,如果你不想为每个工厂指定一个具体的类,你可以使用类似(Kotlin)的东西:

val logger: Logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())
于 2019-02-07T10:04:26.600 回答
0

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

于 2013-01-30T04:32:12.590 回答
0

具有类名的记录器不是强制性的,您可以使用自己的消息。约定使用:

Logger logger = Logger.getLogger(XXX.class) 

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

于 2017-12-27T22:41:12.560 回答
0

尝试使用getName()方法。

private static final Logger log = LogManager.getLogger(JwtAuthenticationFilter.class.getName());
于 2020-02-01T19:01:43.667 回答