什么是Java中的"logger"?

Rom*_*man 9 java oop methods logging

我有一节课,其中我看到以下内容:

this.logger.severe("");
this.logger.warning("");
this.logger.info("");
Run Code Online (Sandbox Code Playgroud)

我不明白几件事:

  1. 我们如何使用之前未定义的方法?我的意思是,课堂上没有定义"记录器"方法.我认为可以定义这些方法,因为所考虑的类是另一个定义了"logger"的类的扩展.但是在类的定义中没有"扩展"语句(只有"实现").

  2. 我可以理解这样的事情:"objectName.methodName".但那是什么"objectName.something1.something2"?"something1.something2"是方法的名称?方法名称可以包含点吗?

  3. 究竟这些"记录器.*"到底是什么?我认为他们保存了有关代码执行的信息.他们写了关于执行期间发生的事情的报告.但在哪里可以找到这些信息?

添加:

在文件的开头我有:import java.util.logging.Logger;
然后在课堂上我有:private Logger logger = Logger.getLogger("a.b.c.d");
所以,logger是Logger类的一个对象(但是我不明白为什么他们不能使用"new Logger()"以通常的方式实例化类.我也不明白logger.severe("")到底做了什么.

Bal*_*usC 13

记录器没有任何特殊之处.这只是Java代码.

public class SomeClass {
    private Logger logger = LogFactory.getLogger(SomeClass.class);

    public void doSomething() {
        this.logger.debug("foo");
    }
}
Run Code Online (Sandbox Code Playgroud)

this.logger刚刚指向命名实例变量logger(当前实例的this).this.在这个例子中,前缀是超级丰富的.人们也可以在logger.debug("foo")这里做.

如果它没有在SomeClass自身中声明,那么它很可能在扩展类中声明.检查声明的类extends.

至于你的objectName.something1.something2疑问,你已经看过它的System.out.println()作用了吗?所述System.out返回一个PrintStream对象,该对象反过来又一个println()方法.因此,如果使用方法objectName.something返回fullworthy Object,那么您可以继续链接方法调用.

基本上,

objectName.something1.something2;
Run Code Online (Sandbox Code Playgroud)

可翻译为

SomeObject someObject = objectName.something1;
someObject.something2;
Run Code Online (Sandbox Code Playgroud)

但是,如果您不需要someObject代码中的任何其他位置,那么它可以像您的示例中那样缩短.

更新:根据您的更新:

因此,记录是记录器类的一个对象(但我不明白为什么他们不能用通常的方式实例化类"新记录器()).我也想不明白到底是什么logger.severe("")做.

只需阅读相关课程的javadoc即可.至于为什么它不能被实例化,这是因为工厂模式.

更新2:根据另一个混淆:

我不明白为什么他们使用"这个".我的意思是,如果我只使用字段名称,默认情况下它不会是该对象的字段吗?我在"this.x"和"x"之间有什么区别吗?

通过这种方式,您可以更明确地了解您要访问的是哪一个.如果方法包含例如参数或具有名称的局部变量logger,那么this.logger仍然会引用实例变量.

public class SomeClass {
    private Logger logger = LogFactory.getLogger(SomeClass.class);

    public void doSomething(Logger logger) {
        this.logger.debug("foo"); // Refers to the instance variable.
        logger.debug("foo"); // Refers to the method argument.
    }

    public void doSomethingElse() {
        Logger logger = LogFactory.getLogger(SomeClass.class);
        this.logger.debug("foo"); // Refers to the instance variable.
        logger.debug("foo"); // Refers to the method local variable.
    }
}
Run Code Online (Sandbox Code Playgroud)


Kir*_*ein 3

  1. “记录器”将是另一个对象,而不是方法。该记录器类将定义其方法,例如public void severe(String message)

  2. “something1”将是“objectName”包含的对象。例如,Car.Engine.Cylinder.Fire()使用像这样的方法来点燃汽车气缸被认为是不好的做法,你应该做更多类似的事情Car.StartEngine()(有关更多信息,请参阅德米特定律)

  3. 记录器将记录程序中发生的情况,因此如果以后出现崩溃或错误,您可以看到发生了什么。无论是将其记录到文本文件还是数据库中的某个位置,都将取决于记录器的实现。