8.idea創建maven項目(使用Log4j日志記錄框架+Log4j 介紹)
在 IntelliJ IDEA 的 Maven 項目中引入了 Log4j,并配置了日志同時輸出到控制臺和文件。
Log4j 提供了靈活的日志配置選項,可以根據項目需求調整日志級別、輸出目標和格式。
1. 創建 Maven 項目
- 打開 IntelliJ IDEA。
- 選擇 “File” > “New” > “Project…”。
- 選擇 “Maven”,點擊 “Next”。
- 填寫 GroupId 和 ArtifactId,點擊 “Next”。
- 確認項目位置,點擊 “Finish”。
2. 添加 Log4j 依賴
在項目的 pom.xml
文件中添加 Log4j 2.x 依賴:
<!-- 項目依賴 --><dependencies><!-- Log4j 2.x 依賴 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.20.0</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.20.0</version></dependency></dependencies>
3. 創建 Log4j 配置文件
在 src/main/resources
目錄下創建 log4j2.xml
文件,配置 Log4j 的日志輸出格式和級別:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Log4j 2.x 配置文件這個文件定義了日志記錄的行為,包括日志級別、輸出目標、格式等。
-->
<Configuration status="WARN"><!-- <Configuration> 根元素- status: 設置 Log4j 自身的日志級別(如 WARN、ERROR 等)。用于調試 Log4j 自身的運行狀態。--><Appenders><!-- <Appenders> 元素- 定義日志輸出的目標(Appender)。- 可以配置多個 Appender(如控制臺、文件、數據庫等)。--><!-- 控制臺輸出 Appender --><Console name="Console" target="SYSTEM_OUT"><!-- <Console> 元素- name: Appender 的名稱(用于在 Logger 中引用)。- target: 輸出目標(SYSTEM_OUT 表示標準輸出,即控制臺)。--><!-- 日志格式化配置 --><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/><!-- <PatternLayout> 元素- pattern: 定義日志消息的格式。- %d{HH:mm:ss.SSS}: 日期時間(時:分:秒.毫秒)。- [%t]: 線程名(中括號包裹)。- %-5level: 日志級別(左對齊,寬度為 5)。- %logger{36}: 日志記錄器名稱(最大長度為 36)。- %msg: 日志消息。- %n: 換行符。--></Console><!-- 文件輸出 Appender --><File name="File" fileName="logs/app.log"><!-- <File> 元素- name: Appender 的名稱(用于在 Logger 中引用)。- fileName: 指定日志文件的路徑和名稱。--><!-- 日志格式化配置 --><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/><!-- <PatternLayout> 元素- pattern: 定義日志消息的格式。- %d{yyyy-MM-dd HH:mm:ss.SSS}: 日期時間(年-月-日 時:分:秒.毫秒)。- [%t]: 線程名(中括號包裹)。- %-5level: 日志級別(左對齊,寬度為 5)。- %logger{36}: 日志記錄器名稱(最大長度為 36)。- %msg: 日志消息。- %n: 換行符。--></File></Appenders><Loggers><!-- <Loggers> 元素- 定義日志記錄器的配置(如日志級別、輸出目標)。--><!-- 根日志記錄器配置 --><Root level="info"><!-- <Root> 元素- level: 設置根日志記錄器的日志級別(如 DEBUG、INFO、WARN、ERROR)。低于該級別的日志將不會被記錄。--><!-- 引用 Appender --><AppenderRef ref="Console"/><AppenderRef ref="File"/><!-- <AppenderRef> 元素- ref: 引用之前定義的 Appender 的名稱(如 "Console" 和 "File")。將日志輸出到指定的 Appender。--></Root></Loggers>
</Configuration>
4. 編寫示例代碼
在 src/main/java
目錄下創建一個 Java 類,使用 Log4j 記錄日志:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class App {// 獲取 Logger 實例,用于記錄日志private static final Logger logger = LogManager.getLogger(App.class);public static void main(String[] args) {// 記錄 INFO 級別的日志logger.info("程序啟動");try {// 示例:記錄輸入輸出String input = "Hello, Log4j!";// 記錄 DEBUG 級別的日志(只有 DEBUG 及以上級別的日志會被記錄)logger.debug("輸入內容: {}", input);String output = processInput(input);logger.debug("輸出內容: {}", output);// 記錄 INFO 級別的日志logger.info("程序運行正常");} catch (Exception e) {// 記錄 ERROR 級別的日志,并附帶異常信息logger.error("程序運行出錯", e);}}// 示例方法:處理輸入字符串private static String processInput(String input) {return input.toUpperCase();}
}
5. 運行程序
- 在 IntelliJ IDEA 中右鍵點擊
App
類。 - 選擇 “Run ‘App.main()’”.
- 程序運行后,日志會同時輸出到控制臺和文件
logs/app.log
。
5.1 由于log4j2.xml配置了記錄級別≥info,所以控制臺與文件,未記錄debug級別的日志
5.2 修改log4j2.xml,配置為記錄級別≥debug,查看運行結果,結果便記錄了≥debug日志級別的日志
Log4j 介紹
1. Log4j 是什么?
Log4j 是一款功能強大、靈活且高性能的Java 日志記錄框架,尤其是 Log4j 2.x 版本,解決了 Log4j 1.x 的許多問題,并提供了許多高級功能。它是許多大型 Java 項目的首選日志框架。然而,在使用時需要注意安全配置(如避免 Log4Shell 漏洞),并根據項目需求選擇合適的日志級別和輸出目標。它提供了靈活的日志記錄功能,支持將日志輸出到控制臺、文件、數據庫、網絡等多種目標,并支持日志級別、格式化、過濾等高級功能。
2. Log4j 的主要版本
-
Log4j 1.x:
- 第一個穩定版本,功能強大但設計較老舊。
- 已被官方標記為“結束生命周期”(EOL),不再維護。
- 存在一些已知的安全漏洞(如 Log4Shell 漏洞)。
-
Log4j 2.x:
- 完全重寫的版本,性能更高、功能更豐富。
- 支持異步日志記錄、Lambda 表達式、插件化架構等。
- 是當前推薦使用的版本。
3. Log4j 的核心組件
Log4j 的架構主要由以下組件組成:
-
Logger(日志記錄器):
- 用于記錄日志消息的入口。
- 通過類名或名稱空間獲取 Logger 實例(如
LogManager.getLogger(MyClass.class)
)。 - 支持日志級別(如
DEBUG
、INFO
、WARN
、ERROR
)。
-
Appender(輸出目標):
- 定義日志輸出的目標(如控制臺、文件、數據庫、網絡等)。
- 常用 Appender:
ConsoleAppender
:輸出到控制臺。FileAppender
/RollingFileAppender
:輸出到文件(支持滾動日志)。SocketAppender
:通過網絡輸出到遠程服務器。
-
Layout(日志格式化):
- 定義日志消息的格式(如時間、線程名、日志級別、日志消息等)。
- 常用 Layout:
PatternLayout
:支持自定義格式(如%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n
)。JSONLayout
:輸出 JSON 格式的日志。
-
Filter(過濾器):
- 用于過濾日志消息(如根據日志級別、日志內容等)。
-
Level(日志級別):
- 定義日志的優先級,從低到高:
TRACE
:調試細節。DEBUG
:調試信息。INFO
:一般信息。WARN
:警告信息。ERROR
:錯誤信息。FATAL
:嚴重錯誤。
- 定義日志的優先級,從低到高:
4. Log4j 的工作原理
-
日志記錄流程:
- 應用程序通過 Logger 實例調用日志方法(如
logger.info("message")
)。 - Log4j 根據日志級別和配置決定是否記錄該消息。
- 如果記錄,消息會通過 Appender 輸出到目標(如控制臺、文件)。
- 在輸出前,可以通過 Layout 格式化消息。
- 應用程序通過 Logger 實例調用日志方法(如
-
配置方式:
- XML 配置:通過
log4j2.xml
文件配置。 - Properties 配置:通過
log4j2.properties
文件配置。 - 編程式配置:通過 Java 代碼動態配置。
- XML 配置:通過
5. Log4j 的優勢
- 高性能:
- Log4j 2.x 支持異步日志記錄,通過 LMAX Disruptor 庫實現無鎖隊列,大幅提高日志記錄性能。
- 靈活性:
- 支持多種 Appender、Layout 和 Filter,可以輕松擴展。
- 易用性:
- 提供簡單的 API 和豐富的配置選項。
- 可維護性:
- 日志級別和輸出目標可以動態調整(無需重啟應用)。
- 安全性:
- Log4j 2.x 修復了 Log4j 1.x 中的安全漏洞(如 Log4Shell)。
6. Log4j 的安全注意事項
- Log4Shell 漏洞:
- Log4j 1.x 和 Log4j 2.x 的早期版本存在嚴重的遠程代碼執行漏洞(CVE-2021-44228)。
- 解決方案:
- 升級到 Log4j 2.17.1 或更高版本。
- 禁用 JNDI 查找(通過配置
log4j2.component.properties
或環境變量)。
- 最小權限原則:
- 日志文件和配置文件的目錄應設置適當的權限,防止未授權訪問。