1.1 日誌介紹
日誌是已發生事件的列表。幾乎就像一本航海雜誌或日記。那麼,相應地,記錄器是一個可以用來記錄的對象。在編程中,習慣上記錄幾乎所有內容。在 Java 中,一切都是這樣,甚至更多。
![記錄器java](https://cdn.codegym.cc/images/article/df09efd4-dece-47be-a17c-a89c3b63974e/800.jpeg)
事實上,Java 程序通常是沒有 UI、控制台等的大型服務器應用程序。他們同時處理來自數千個用戶的請求,經常會出現各種錯誤。特別是當不同的線程開始相互干擾時。
而且,事實上,在這種情況下找到很少重現的錯誤和故障的唯一方法是將每個線程中發生的所有事情寫入日誌/文件。
大多數情況下,有關調用方法的參數、所有截獲的錯誤以及大量中間信息的信息會寫入日誌。日誌越完整,就越容易恢復事件的順序並跟踪故障或錯誤的原因。
但是日誌越大,使用它就越困難。有時日誌每天達到幾千兆字節。這可以。
1.2 失敗日誌
作為第一個日誌,開發人員使用簡單的輸出到控制台。在應用程序調試期間這樣做很方便——當所有重要信息和變量值都寫入控制台時。但是這樣的日誌在應用程序正常運行期間是完全不適用的。
首先,應用程序可能希望自己向控制台輸出一些內容,而用戶根本不想看到為程序員準備的服務信息。
其次,控制台緩衝區的大小是有限的,你不能在那裡寫太多。
最後,第三,應該將長期收集的有關程序錯誤的信息發送給程序開發人員。一次將所有這些信息寫入一個文件是最方便的。
開發人員很快解決了第一個問題——他們想出了另一個輸出流—— System.err
。您可以向它寫入消息,它們將被發送到一個單獨的線程,而不是標準控制台。
甚至寫入文件的問題也解決了:
// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
throw new Exception("Error message");
} catch (Exception e) {
e.printStackTrace();
}
但即使是這種形式,也沒有解決全部問題,因此決定創建一個特殊的庫,將日誌消息寫入文件。她以一種聰明的方式做到了這一點,並允許靈活地為記錄的事件和數據配置過濾器。
整個日誌記錄過程,其實包括三個部分:
- 第一部分是信息收集。
- 第二部分是對收集到的信息進行過濾。
- 第三部分是選擇信息的記錄。
1.3 log4j記錄器簡介
Java 社區中第一個流行的記錄器是log4j
. 將它包含在項目中非常簡單,為此您只需要在 pom.xml 中添加幾行
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>2.2.17</version>
</dependency>
您的程序與此類記錄器的交互看起來像這樣:
class Manager {
private static final Logger logger = LoggerFactory.getLogger(Manager.class);
public boolean processTask(Task task) {
logger.debug("processTask id = " + task.getId());
try {
task.start();
task.progress();
task.complete();
return true;
} catch (Exception e) {
logger.error("Unknown error", e);
return false;
}
}
}
這裡發生了三件事:
對象的創建以綠色突出顯示 Logger
。它的對象存儲在一個靜態變量中,以便於進一步使用它。並且還將getLogger()
有關收集信息的類的信息傳遞給該方法。
以藍色突出顯示的行是我們僅在調試期間記錄有價值信息的地方。為此,使用了一種特殊的方法 -debug()
最後,我們將出現的異常保存到日誌中的行以紅色突出顯示。異常是潛在的錯誤,因此error()
.
GO TO FULL VERSION