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

roa*_*oul 60 java log4j

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

 Logger logger = Logger.getLogger("com.foo.Bar");
Run Code Online (Sandbox Code Playgroud)

要么

 Logger logger = Logger.getLogger(XXX.class);
Run Code Online (Sandbox Code Playgroud)

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

小智 59

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

  2. 很多人之所以使用类型,我猜:

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

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

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


Joh*_*thy 9

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

public class SomeClass {
    private static final Logger LOG = Logger.getLogger(SomeClass.class);
    ...
}
Run Code Online (Sandbox Code Playgroud)

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


小智 7

1:您可以在之前在log4j.properties中定义时使用"类名"或"字符串名称",例如

log4j.logger.anything=INFO,anything
Run Code Online (Sandbox Code Playgroud)

所以,你可以记录你的日志

 Logger logger = Logger.getLogger("anything");
Run Code Online (Sandbox Code Playgroud)

2:如果您定义了一些日志名称,您可以轻松地进行检查,因为它们是分开的.