![](/img/trans.png)
[英]In Java, what is the difference between the global logger and the root logger?
[英]What is “logger” in Java?
我有一節課,其中我看到以下內容:
this.logger.severe("");
this.logger.warning("");
this.logger.info("");
我不明白幾件事:
我們如何使用之前未定義的方法? 我的意思是,課堂上沒有定義“記錄器”方法。 我認為可以定義這些方法,因為所考慮的類是另一個定義了“logger”的類的擴展。 但是在類的定義中沒有“擴展”語句(只有“實現”)。
我可以理解這樣的事情:“objectName.methodName”。 但那是什么“objectName.something1.something2”? “something1.something2”是方法的名稱? 方法名稱可以包含點嗎?
究竟這些“記錄器。*”到底是什么? 我認為他們保存了有關代碼執行的信息。 他們寫了關於執行期間發生的事情的報告。 但在哪里可以找到這些信息?
添加:
在文件的開頭我有: import java.util.logging.Logger;
然后在我的類中: private Logger logger = Logger.getLogger("abcd")
;
所以,logger是Logger類的一個對象(但是我不明白為什么他們不能使用“new Logger()”以通常的方式實例化類。我也不明白logger.severe(“”)到底是做什么的。
記錄器沒有任何特殊之處。 這只是Java代碼。
public class SomeClass {
private Logger logger = LogFactory.getLogger(SomeClass.class);
public void doSomething() {
this.logger.debug("foo");
}
}
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;
可翻譯為
SomeObject someObject = objectName.something1;
someObject.something2;
但是如果你在代碼中的任何其他位置都不需要someObject
,那么它可以像你的例子一樣縮短。
更新 :根據您的更新:
所以,logger是Logger類的一個對象(但是我不明白為什么他們不能使用“new Logger()”以通常的方式實例化類。我也不明白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.
}
}
'logger'將是另一個對象,而不是方法。 此logger類將在其上定義方法,如public void severe(String message)
'something1'將是'objectName'包含的對象。 例如, Car.Engine.Cylinder.Fire()
,使用一種方法像這樣觸發汽車的氣缸被認為是不好的做法,你應該做更像Car.StartEngine()
的事情 (更多信息請參見demeter定律 Car.StartEngine()
)
記錄器將記錄程序中發生的情況,因此如果發生崩潰或后來發生錯誤,您可以看到發生了什么。 無論是記錄到文本文件還是記錄到某個數據庫,都將記錄到記錄器的實現中。
編輯:更改了log4j鏈接。
logger不是一個方法,而是一個類變量,它似乎是一個暴露方法“嚴重”,“警告”和“信息”的對象。
檢查你的課程,例如“someClass logger = new someClass();”
java.util.Logger類是Java日志API的主要訪問點。 以下是創建記錄器的方法:
Logger logger = Logger.getLogger("myLogger");
作為參數傳遞給getLogger()工廠方法的字符串是要創建的Logger的名稱。 您可以自由選擇名稱,但名稱表示Logger在Logger層次結構中的位置。 每一個。 名稱中的(點)被解釋為層次結構中的分支。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.