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

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

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

要么

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

这将初始化logging器对象。但我的问题是为什么需要发送类types作为参数? 看来,当我使用logging器,我不关心在哪个类我使用它。所以types似乎没有对logging器的影响。 如果我把一个logging器声明为静态和公共的,我可以在另一个类中调用这个logging器,那么作者的devise意图是什么呢? 当我使用logging器时,类types会绑定什么? 或者我可以发送任何类types的getLogger函数。

  1. 您可以始终使用任何string作为logging器名称而不是类别types。 这绝对没问题。

  2. 为什么很多人使用类的types,我猜:

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

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

    • 当你分发你的课程时,人们可能希望将日志从你的class级redirect到一个特定的文件或其他地方。 在这种情况下,如果您使用特殊的logging器名称,我们可能需要检查源代码,或者如果源不可用,则无法执行此操作。

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

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

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

1:在log4j.properties中定义之前,可以使用“class name”或“string name”,比如

 log4j.logger.anything=INFO,anything 

所以,你可以logging你的日志

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

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

XXX.class是命名您的logging器,即标志后续的日志语句。 让你知道某些日志语句属于哪个类。

你可以通过类的types来跟踪你的日志。

例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类和logging器消息,那么很难find日志消息的来源。