
- log4j 教程
- log4j - 首頁
- log4j - 概述
- log4j - 安裝
- log4j - 架構
- log4j - 配置
- log4j - 示例程式
- log4j - 日誌方法
- log4j - 日誌級別
- log4j - 日誌格式化
- log4j - 檔案日誌
- log4j - 資料庫日誌
- log4j 有用資源
- log4j - 問題與解答
- log4j - 快速指南
- log4j - 有用資源
- log4j - 討論
log4j - 面試問題
尊敬的讀者,這些log4j 面試問題專為幫助您熟悉在log4j主題面試中可能遇到的問題型別而設計。根據我的經驗,優秀的 interviewers 很少會在面試前計劃具體問題,通常會從該主題的一些基本概念開始提問,然後根據後續的討論和您的回答繼續提問。
log4j 是一個可靠、快速且靈活的 Java 編寫的日誌框架(API),根據 Apache 軟體許可證分發。
log4j 已移植到 C、C++、C#、Perl、Python、Ruby 和 Eiffel 等語言。
log4j 在執行時可以透過外部配置檔案進行高度配置。它將日誌記錄過程視為優先順序級別,並提供機制將日誌資訊定向到各種目的地,例如資料庫、檔案、控制檯、UNIX Syslog 等。log4j 有三個主要元件:
記錄器(loggers):負責捕獲日誌資訊。
附加器(appenders):負責將日誌資訊釋出到各種首選目的地。
佈局(layouts):負責以不同的樣式格式化日誌資訊。
以下是 log4j 的功能:
它是執行緒安全的。
它針對速度進行了最佳化。
它基於命名日誌記錄器層次結構。
它支援每個日誌記錄器的多個輸出附加器。
它支援國際化。
它不受預定義設施集的限制。
可以在執行時使用配置檔案設定日誌行為。
它從一開始就被設計用來處理 Java 異常。
它使用多個級別,即 ALL、TRACE、DEBUG、INFO、WARN、ERROR 和 FATAL。
可以透過擴充套件 Layout 類輕鬆更改日誌輸出的格式。
日誌輸出的目標以及寫入策略可以透過 Appender 介面的實現來更改。
它是故障停止的。但是,儘管它確實努力確保交付,但 log4j 並不保證每個日誌語句都會交付到其目標。
以下是日誌記錄的優缺點:
日誌記錄是軟體開發的重要組成部分。編寫良好的日誌程式碼可以提供快速除錯、輕鬆維護以及應用程式執行時資訊的結構化儲存。
日誌記錄也存在缺點。它會降低應用程式速度。如果過於冗長,會導致滾動盲。為了緩解這些問題,log4j 被設計為可靠、快速且可擴充套件的。
由於日誌記錄很少是應用程式的主要焦點,因此 log4j API 力求易於理解和使用。
Logger 物件 - log4j 架構的頂層是 Logger,它提供 Logger 物件。Logger 物件負責捕獲日誌資訊,並將它們儲存在名稱空間層次結構中。
Layout 物件 - log4j 架構的佈局層提供用於以不同樣式格式化日誌資訊的 objects。它在釋出日誌資訊之前為附加器物件提供支援。
Layout 物件在以人類可讀且可重用的方式釋出日誌資訊方面發揮著重要作用。
Appender 物件 - 這是 log4j 架構的較低層,它提供 Appender 物件。Appender 物件負責將日誌資訊釋出到各種首選目的地,例如資料庫、檔案、控制檯、UNIX Syslog 等。
Level 物件 - Level 物件定義任何日誌資訊的粒度和優先順序。API 中定義了七個日誌級別:OFF、DEBUG、INFO、ERROR、WARN、FATAL 和 ALL。
Filter 物件 - Filter 物件用於分析日誌資訊,並進一步決定是否應記錄該資訊。一個 Appender 物件可以有多個 Filter 物件與其關聯。如果將日誌資訊傳遞給特定的 Appender 物件,則該 Appender 關聯的所有 Filter 物件都需要批准日誌資訊,然後才能將其釋出到附加的目標。
ObjectRenderer - ObjectRenderer 物件專門提供傳遞到日誌框架的不同物件的字串表示形式。此物件由 Layout 物件用於準備最終的日誌資訊。
LogManager - LogManager 物件管理日誌框架。它負責從系統範圍的配置檔案或配置類中讀取初始配置引數。
log4j.properties 檔案是 log4j 配置檔案,它以鍵值對的形式儲存屬性。預設情況下,LogManager 在 CLASSPATH 中查詢名為 log4j.properties 的檔案。
layout - Appender 使用 Layout 物件及其關聯的轉換模式來格式化日誌資訊。
target - 根據附加器,target 可以是控制檯、檔案或其他專案。
level - level 用於控制日誌訊息的過濾。
threshold - Appender 可以具有與其關聯的閾值級別,獨立於日誌記錄器級別。Appender 會忽略任何級別低於閾值級別的日誌訊息。
filter - Filter 物件可以分析超出級別匹配的日誌資訊,並決定是否應由特定 Appender 處理日誌請求或忽略。
以下語法定義了帶有附加器檔案的根日誌記錄器
# Define the root logger with appender file log = /usr/home/log4j log4j.rootLogger = DEBUG, FILE
以下語法定義了檔案附加器:
# Define the file appender log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=${log}/log.out
以下語法定義了檔案附加器的佈局:
# Define the layout for file appender log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.conversionPattern=%m%n
任何其他命名的 Logger 物件例項都是透過第二種方法獲得的,方法是傳遞日誌記錄器的名稱。日誌記錄器的名稱可以是您傳遞的任何字串,通常是類或包名稱,就像我們在上一章中使用的那樣,如下所示:
static Logger log = Logger.getLogger(log4jExample.class.getName());
Logger 類的 public void debug(Object message) 使用 Level.DEBUG 級別列印訊息。
Logger 類的 public void error(Object message) 使用 Level.ERROR 級別列印訊息。
Logger 類的 public void fatal(Object message) 使用 Level.FATAL 級別列印訊息。
Logger 類的 public void info(Object message) 使用 Level.INFO 級別列印訊息。
Logger 類的 public void warn(Object message) 使用 Level.WARN 級別列印訊息。
Logger 類的 public void trace(Object message) 使用 Level.TRACE 級別列印訊息。
ALL - 所有級別,包括自定義級別。
DEBUG - 指定細粒度的資訊事件,這些事件對於除錯應用程式最有幫助。
ERROR - 指定可能仍然允許應用程式繼續執行的錯誤事件。
FATAL - 指定非常嚴重的錯誤事件,這些事件可能會導致應用程式中止。
INFO - 指定以粗粒度級別突出顯示應用程式進度的資訊訊息。
OFF - 最高可能的級別,旨在關閉日誌記錄。
TRACE - 指定比 DEBUG 更細粒度的資訊事件。
WARN - 指定潛在的有害情況。
如果 p >= q,則日誌記錄器級別為 q 的日誌請求級別為 p 將被啟用。此規則是 log4j 的核心。它假設級別是有序的。對於標準級別,我們有 ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
以下語法定義了關閉 DEBUG 模式並啟用 WARN 模式的根日誌記錄器。
# Define the root logger with appender file log = /usr/home/log4j log4j.rootLogger = WARN, FILE
如果要根據模式生成特定格式的日誌資訊,則可以使用 org.apache.log4j.PatternLayout 來格式化日誌資訊。
PatternLayout 類擴充套件抽象 org.apache.log4j.Layout 類並覆蓋 format() 方法,以根據提供的模式構造日誌資訊。
c - 用於輸出日誌事件的類別。例如,對於類別名稱“a.b.c”,模式 %c{2} 將輸出“b.c”。
C - 用於輸出發出日誌請求的呼叫者的完全限定類名。例如,對於類名“org.apache.xyz.SomeClass”,模式 %C{1} 將輸出“SomeClass”。
d - 用於輸出日誌事件的日期。例如,%d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}。
F - 用於輸出發出日誌請求的檔名。
l − 用於輸出生成日誌事件的呼叫者的位置資訊。
L − 用於輸出發出日誌請求的行號。
m − 用於輸出與日誌事件關聯的應用程式提供的訊息。
M − 用於輸出發出日誌請求的方法名稱。
n − 輸出平臺相關的行分隔符字元或字元。
p − 用於輸出日誌事件的優先順序。
r − 用於輸出從佈局構建到建立日誌事件之間經過的毫秒數。
t − 用於輸出生成日誌事件的執行緒名稱。
x − 用於輸出與生成日誌事件的執行緒關聯的 NDC(巢狀診斷上下文)。
X − X 轉換字元後跟 MDC 的鍵。例如,X{clientIP} 將列印儲存在 MDC 中針對鍵 clientIP 的資訊。
% − 字面百分號。%% 將列印一個 % 符號。
預設情況下,相關資訊將按原樣顯示為輸出。但是,藉助格式修飾符,可以更改最小欄位寬度、最大欄位寬度和對齊方式。
%20c − 如果類別名稱少於 20 個字元,則用空格左填充。
%-20c − 如果類別名稱少於 20 個字元,則用空格右填充。
%.30c − 如果類別名稱超過 30 個字元,則從開頭截斷。
%20.30c − 如果類別名稱短於 20 個字元,則用空格左填充。但是,如果類別名稱超過 30 個字元,則從開頭截斷。
%-20.30c − 如果類別名稱短於 20 個字元,則用空格右填充。但是,如果類別名稱超過 30 個字元,則從開頭截斷。
如果要生成 HTML 格式的日誌資訊檔案,則可以使用 org.apache.log4j.HTMLLayout 來格式化日誌資訊。
HTMLLayout 類擴充套件了抽象的 org.apache.log4j.Layout 類,並覆蓋了其基類的 format() 方法以提供 HTML 樣式的格式。
它提供以下資訊以供顯示:
生成特定日誌事件之前應用程式啟動後經過的時間。
呼叫日誌請求的執行緒名稱。
與此日誌請求關聯的級別。
記錄器和日誌訊息的名稱。
程式檔案和呼叫此日誌的行號的可選位置資訊。
HTMLLayout.setContentType(String) − 設定 HTML 內容的內容型別。預設為 text/html。
HTMLLayout.setLocationInfo(String) − 設定日誌事件的位置資訊。預設為 false。
HTMLLayout.setTitle(String) − 設定 HTML 檔案的標題。預設為 log4j Log Messages。
immediateFlush − 此標誌預設設定為 true,這意味著輸出流到檔案的每次追加操作都會被重新整理。
encoding − 可以使用任何字元編碼。預設情況下,它是平臺特定的編碼方案。
threshold − 此附加程式的閾值級別。
Filename − 日誌檔案的名稱。
fileAppend − 此標誌預設設定為 true,這意味著日誌資訊被追加到同一檔案的末尾。
bufferedIO − 此標誌指示是否需要啟用緩衝寫入。預設情況下,它設定為 false。
bufferSize − 如果啟用了緩衝 I/O,則指示緩衝區大小。預設情況下,它設定為 8kb。
以下程式碼將 immediate flush 配置為 true:
# Set the immediate flush to true (default) log4j.appender.FILE.ImmediateFlush=true
以下程式碼將閾值設定為除錯模式:
# Set the threshold to debug mode log4j.appender.FILE.Threshold=debug
以下程式碼將追加設定為 false,覆蓋:
# Set the append to false, overwrite log4j.appender.FILE.Append=false
要將日誌資訊寫入多個檔案,您需要使用 org.apache.log4j.RollingFileAppender 類,該類擴充套件了 FileAppender 類並繼承了其所有屬性。
這是檔案的大小臨界值,超過此值將滾動檔案。
預設值為 10 MB。
此屬性表示要建立的備份檔案數量。
預設值為 1。
以下程式碼配置了 RollingFileAppender:
# Define the root logger with appender file log4j.rootLogger = DEBUG, FILE # Define the file appender log4j.appender.FILE=org.apache.log4j.RollingFileAppender
以下程式碼配置了滾動前最大檔案大小:
# Set the maximum file size before rollover log4j.appender.FILE.MaxFileSize=5KB
以下程式碼配置了要使用的最大檔案數:
# Set the the backup index log4j.appender.FILE.MaxBackupIndex=2
將建立一個新的日誌檔案。
一旦最後一個日誌檔案達到最大大小,第一個日誌檔案將被擦除,此後,所有日誌資訊將回滾到第一個日誌檔案。
要將日誌資訊寫入每天的檔案中,您需要使用 org.apache.log4j.DailyRollingFileAppender 類,該類擴充套件了 FileAppender 類並繼承了其所有屬性。
這指示何時滾動檔案以及要遵循的命名約定。預設情況下,每天午夜執行滾動。
'.' yyyy-MM − 在每個月結束時和下一個月的開始時滾動。
'.' yyyy-MM-dd − 每天午夜滾動。這是預設值。
'.' yyyy-MM-dd-a − 每天中午和午夜滾動。
'.' yyyy-MM-dd-HH − 每小時滾動。
'.' yyyy-MM-dd-HH-mm − 每分鐘滾動。
'.' yyyy-ww − 根據區域設定在每週的第一天滾動。
以下程式碼配置了 DailyRollingFileAppender:
# Define the root logger with appender file log4j.rootLogger = DEBUG, FILE # Define the file appender log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender
以下程式碼配置了 DatePattern:
# Set the DatePattern log4j.appender.FILE.DatePattern = '.' yyyy-MM-dd-a
log4j API 提供了 org.apache.log4j.jdbc.JDBCAppender 物件,該物件可以將日誌資訊放入指定的資料庫中。
driver − 將驅動程式類設定為指定的字串。如果未指定驅動程式類,則預設為 sun.jdbc.odbc.JdbcOdbcDriver。
password − 設定資料庫密碼。
sql − 指定每次發生日誌事件時要執行的 SQL 語句。這可能是 INSERT、UPDATE 或 DELETE。
URL − 設定 JDBC URL。
user − 設定資料庫使用者名稱。
下一步是什麼?
接下來,您可以回顧一下您之前完成的與該主題相關的作業,並確保您能夠自信地談論它們。如果您是應屆畢業生,面試官不會期望您能回答非常複雜的問題,而是需要您將基礎概念掌握牢固。
其次,如果您無法回答幾個問題,其實關係不大,重要的是,無論您回答了什麼,都必須充滿自信地回答。所以在面試過程中要保持自信。Tutorialspoint 祝您面試順利,並祝您未來的事業一切順利。乾杯 :-)