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
或环境变量)。
- 最小权限原则:
- 日志文件和配置文件的目录应设置适当的权限,防止未授权访问。