当前位置: 首页 > 知识库问答 >
问题:

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

蓝昊天
2023-03-14

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

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

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

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

共有3个答案

郎翔
2023-03-14

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

log4j.logger.anything=INFO,anything

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

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

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

顾承平
2023-03-14

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

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

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

辛意智
2023-03-14

>

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

    我想很多人使用类类型的原因是:

    >

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

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

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

  •  类似资料:
    • 问题内容: 在较高的层次上,我知道我们需要通过使用它们各自的包装类在Java集合中使用它们来“包装”原始数据类型,例如int和char。我想了解Java集合如何在低级询问:“为什么我们需要将原始数据类型包装为对象才能在集合中使用它们?”在此先感谢您的帮助。 问题答案: 在虚拟机级别,这是因为与引用类型(例如java.lang.Object及其派生类型)相比,原始类型在内存中的表示方式非常不同。例如

    • 问题内容: 我正在进行硒学习,当我探索与键盘和鼠标主题的交互时,我找到了这段代码。在Robot类的帮助下,执行Enter: 在动作类的帮助下,执行Enter: 为什么我们需要两个班级执行相同的动作?Robot类和Actions类有什么区别?TIA。 问题答案: 机器人课 机器人类 在 java.desktop 模块的 java.awt 包中定义。此类用于处理与 Test Automation 相关

    • 问题内容: 当您使用Exception类扩展一个类(用于创建新的异常)时,会收到警告,提示您有一个。我知道这在序列化和反序列化过程中起着重要的作用,但是何时需要序列化我的Exception?谁能给我一个实际的案例,让我的自定义异常类具有序列化和反序列化? 问题答案: 这是因为所有异常的根类都实现了接口。默认情况下,所有异常都是可序列化的,这是一种语言设计决策,因为作者希望异常能够在没有任何特殊配置

    • 问题内容: 我有一个类A,具有抽象方法doAction(BaseClass obj),期望类型为BaseClass的参数 现在,我还有另一个需要扩展A的类B。但是,B的doAction方法需要使用对象DerivedClass来扩展BaseClass。 当我需要将DerivedClass类型的参数传递给需要BaseClass的方法时,该如何处理呢? 谢谢! 问题答案: 您使基类通用: 以及使用派生类

    • 我有一个方法,它检查一个对象是否已经存在于数组列表中,如果存在,则用新对象替换索引,如果不存在,则添加新对象。 当我编写方法时,我没有返回类型。我收到一个错误,建议我将返回类型设置为void,所以我就这样做了。然后我得到了另一个错误,返回类型必须是布尔的。我唯一的问题是方法本身本质上(至少对我来说)不是true/false返回。我需要它做的只是在ArrayList中添加/替换一个对象,而不是返回任

    • 在模块声明中,requires和requires可传递模块语句之间有什么区别 例如: