JavaRush /Java Blog /Random-TW /為什麼需要日誌記錄?

為什麼需要日誌記錄?

在 Random-TW 群組發布
你好!在撰寫講座時,我會特別注意某個特定主題是否一定會在實際工作中使用。 為什麼需要日誌記錄 - 1 所以,注意!我們今天要討論的主題肯定會對您從第一天工作起的所有專案都有用。 我們將討論日誌記錄。 這個話題一點也不難(我甚至可以說很簡單)。但在你的第一份工作中,已經有足夠的壓力來處理顯而易見的事情,所以最好現在徹底解決它:)所以,讓我們開始吧。什麼是日誌記錄? 日誌記錄是在某處記錄有關程式操作的資料。寫入這些資料的地方稱為「日誌」。同時出現兩個問題:在哪裡記錄資料以及記錄什麼資料?讓我們從「哪裡」開始。您可以在許多不同的地方記錄程式運行資料。例如,在學習過程中,您經常使用System.out.println(). 這是真正的日誌記錄,儘管是最簡單的一種。當然,這對客戶或產品支援團隊來說不是很方便:他們顯然不想安裝 IDE 並監視控制台:) 還有一種更熟悉的記錄資訊的格式 - 在文字檔案中。人們以這種方式更容易閱讀它們,當然也更容易儲存!現在第二個問題:程式運行的哪些資料應該記錄在日誌中? 但在這裡一切都取決於你!Java 日誌系統非常靈活。您可以對其進行配置,以便記錄程式的整個進度。一方面,這很好。但另一方面,想像一下如果所有內容都寫在 Facebook 或 Twitter 日誌上,日誌會達到多大。如此大的公司可能有能力儲存如此大量的資訊。但想像一下,在包含 500 GB 文字的日誌中搜尋有關一個嚴重錯誤的資訊會有多困難?這比大海撈針還要糟糕。因此,可以配置Java中的日誌記錄,以便僅將錯誤資料寫入日誌(log)。甚至只是嚴重錯誤!不過,說「用 Java 登入」並不完全正確。事實上,在將此功能新增至語言之前,程式設計師就已經產生了對日誌記錄的需求。當 Java 擁有自己的日誌庫時,每個人都已經在使用 log4j 函式庫了。Java 中日誌記錄的出現歷史實際上非常悠久且內容豐富;有空時,您可以閱讀Habré 上的這篇文章。簡而言之,Java有自己的日誌庫,但幾乎沒有人使用它:)後來,當出現了幾個不同的日誌庫,並且所有程式設計師都開始使用不同的日誌庫時,就出現了相容性問題。為了防止人們使用十幾個具有不同介面的不同函式庫做同樣的事情,創建了slf4j 抽象框架(“Java 服務日誌外觀”)。之所以稱為抽象,是因為儘管您使用 slf4j 類別並呼叫它們的方法,但它們在底層運行所有先前的日誌框架:log4j、標準 java.util.logging 等。如果您目前需要其他庫沒有的 log4j 的某些特定功能,但您不希望將項目嚴格連結到該特定庫,則只需使用 slf4j。她已經「拉」了 log4j 方法。如果您改變主意並決定不再需要 log4j 功能,則只需重新配置「包裝器」(即 slf4j)即可使用另一個庫。您的程式碼不會停止工作,因為您在其中呼叫 slf4j 的方法,而不是特定庫的方法。一個小題外話。為了使以下範例正常運作,您需要從此處下載 slf4j 庫,並從此處下載 log4j 庫。接下來,我們需要解壓縮存檔並透過 Intellij IDEA 將我們需要的 jar 檔案新增到類別路徑中。選單項目:文件->項目結構-> 選擇必要的 jar 並將它們添加到項目中(我們下載的檔案中有很多 jar,請在圖片中查看您需要的 jar) 為什麼需要日誌記錄 - 2為什麼需要日誌記錄 - 3注意 - 本說明適用於那些不知道如何使用Maven的同學。如果您知道如何使用它,最好嘗試從它開始:通常會更容易。 如果您使用Maven,請新增以下依賴項:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
太好了,我們已經整理好了設定:) 讓我們看看 slf4j 是如何運作的。我們怎麼能確保程式的進度被記錄在某處呢?為此,我們需要兩個東西 -記錄器附加器。讓我們從第一個開始。記錄器是一個完全管理記錄保存的物件。建立記錄器非常簡單:它是使用靜態方法完成的 - LoggerFactory.getLogger()。作為該方法的參數,您需要傳遞一個將記錄其工作的類別。讓我們運行我們的程式碼:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
控制台輸出: ERROR StatusLogger 未找到 Log4j 2 設定檔。使用預設配置(僅將錯誤記錄到控制台)或使用者以程式設計方式提供的配置。設定係統屬性「log4j2.debug」以顯示 Log4j 2 內部初始化日誌記錄。有關如何設定 Log4j 2 15:49:08.907 [main] 錯誤 MyTestClass - 程式中發生錯誤! 我們在這裡看到什麼?首先我們看到一條錯誤訊息。出現這種情況是因為我們目前缺乏必要的設定。因此,我們的記錄器現在只能輸出錯誤訊息(ERROR)並且只能輸出到控制台。該方法logger.info()沒有被執行。但logger.error()它成功了!控制台顯示當前日期、發生錯誤的方法 ( main)、單字 ERROR 和我們的訊息! ERROR 是日誌記錄等級。 一般來說,如果日誌條目標有“ERROR”一詞,則表示程式中的該點發生了錯誤。如果某個條目標有「INFO」一詞,則表示它只是有關程式正常操作的當前資訊。SLF4J 庫有很多不同的日誌記錄級別,讓您可以靈活地配置日誌記錄。它們非常易於管理:所有必要的邏輯都已包含在類別中Logger。您只需要呼叫必要的方法。如果您想發布常規訊息,請致電logger.info()。錯誤訊息 - logger.error(). 顯示警告 -logger.warn() 現在我們來談談追加器附加程式是您的資料所在的地方。您可以說資料來源的反面是「B 點」。預設情況下,資料輸出到控制台。請注意,在前面的範例中,我們無需配置任何內容:文字出現在控制臺本身中,但 log4j 庫中的記錄器只能將錯誤等級訊息輸出到控制台。人們從文字檔案中讀取日誌並將日誌儲存在同一個檔案中顯然更方便。要更改記錄器的預設行為,我們需要設定檔追加器。首先,您需要在 src 資料夾中建立一個log4j.xml文件,如果您使用Maven,則在resources 資料夾中建立一個log4j.xml 文件,或在resources 資料夾中建立一個log4j.xml 文件(如果您使用Maven)。您已經熟悉 xml 格式了,我們最近有一個關於它的講座:) 其內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
看起來不是特別複雜:)但是我們還是要看一下內容吧。
<Configuration status="INFO">
這就是所謂的狀態記錄器。它與我們的記錄器無關,由 log4j 內部使用。你可以設定status=”TRACE”而不是status=”INFO”,所有關於log4j內部工作的資訊都會輸出到控制台(status-logger將資料輸出到控制台,即使我們程式的appender是file -基於)。我們現在不需要這個,所以我們讓一切保持原樣。
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
在這裡我們創建我們的appender。該標籤<File>表明它將是一個文件。 name="MyFileAppender"- 我們的附加程式的名稱。 fileName="C:\Users\Username\Desktop\testlog.txt"— 將寫入所有資料的日誌檔案的路徑。 append="true"— 是否需要將附加資料寫入文件末尾。在我們的例子中就是這種情況。如果設定為false,則每次程式再次啟動時,舊的日誌內容將會被刪除。 <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- 這些是格式設定。在這裡我們可以使用正規表示式來自訂日誌中文字的格式。
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
這裡我們指定日誌記錄等級(根級別)。我們設定了 INFO 等級:也就是說,所有高於 INFO 等級的訊息(根據我們上面查看的表格)都不會包含在日誌中。我們的程式中將有 3 個訊息:一則訊息、一則警告和一則錯誤。使用目前配置,所有 3 個訊息都將寫入日誌。如果將根層級變更為 ERROR,則只會記錄來自 LOGGER.error() 的最後一則訊息。此外,此處還放置了附加程式的連結。要建立這樣的鏈接,您需要在標籤內<Root>建立一個標籤<ApprenderRef>並向其添加參數ref=”Name твоего аппендера”。我們在這裡創建了附加程式的名稱,以防您忘記: <File name="MyFileAppender" 這是我們程式的程式碼!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
當然,它有點歪(捕捉 RuntimeException 是一個平庸的想法),但它非常適合我們的目的:) 讓我們main()連續運行我們的方法 4 次並查看我們的 testlog.txt 檔案。無需提前建立:庫會自動建立。一切順利!:) 現在您已經設定了記錄器。您可以嘗試之前編寫的一些程序,向所有方法添加記錄器調用,然後查看生成的日誌:) 對於其他閱讀,我強烈推薦這篇文章。那裡深入討論了日誌記錄的主題,一口氣讀完並不容易。但它包含許多有用的附加資訊。例如,您將學習如何配置記錄器,以便在我們的 testlog.txt 檔案達到一定大小時創建一個新的文字檔案:) 這就是我們課程的結束!今天你學到了一個非常重要的主題,這些知識一定會對你以後的工作有用。再見!:)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION