log4j2是apache提供的高性能日志框架,相比log4j 1.x和logback,具备异步日志(基于disruptor)、插件化架构、多格式配置(xml/json/yaml)、自动重载、无垃圾机制等核心优势。

Log4j2 是 Apache 提供的高性能、可扩展的日志框架,相比 Log4j 1.x 和 Logback,它支持异步日志、插件化架构、更灵活的配置方式。在 Java 项目中集成 Log4j2,核心是三步:引入依赖、配置文件、代码中使用。
添加 Log4j2 依赖
根据构建工具选择对应依赖。Maven 项目在 pom.xml 中添加:
注意:
- 不要同时引入 log4j-1.2.x 或 slf4j-log4j12,避免类冲突;
- 若项目已用 SLF4J,应搭配 log4j-slf4j2-impl(不是旧版 log4j-slf4j-impl),并排除其他日志桥接器。
准备配置文件
Log4j2 默认按顺序查找以下配置文件(classpath 根目录):
log4j2-test.yaml → log4j2-test.json → log4j2-test.xml → log4j2.yaml → log4j2.json → log4j2.xml
推荐使用 log4j2.xml(简洁直观)或 log4j2.yaml(结构清晰)。示例 XML 配置片段:
关键点:
- 确保 logs/ 目录存在或有写权限,否则 File Appender 会静默失败;
- 开发时可用 log4j2-test.xml 单独配置 DEBUG 级别,避免污染主配置。
在代码中获取和使用 Logger
不建议直接 new Logger,统一用 LogManager 获取:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class UserService {
private static final Logger logger = LogManager.getLogger(UserService.class);
public void createUser(String name) {
logger.info("Creating user: {}", name);
logger.debug("Debug info for {}", name); // 仅在 debug 级别启用时输出
try {
// ...
} catch (Exception e) {
logger.error("Failed to create user", e); // 自动携带异常栈
}
}
}
小技巧:
- 使用 {} 占位符(非字符串拼接),提升性能;
- 对于耗时计算的日志内容,可用 logger.isInfoEnabled() 做前置判断(尤其在高频逻辑中);
- 异步日志只需把 AsyncLoggerContextSelector 加入 JVM 参数:
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
验证是否生效
启动应用后检查:
- 控制台是否打印 Log4j2 启动信息(如 “Starting LoggerContext”);
- 日志是否按配置输出到控制台或文件;
- 修改日志级别(如改为 debug),看 debug 日志是否出现;
- 故意触发一次异常,确认 error 日志含完整堆栈。
若无输出,常见原因:
- 配置文件名拼写错误(如 log4j2.xml 写成 log4j.xml);
- 文件未放在 classpath 根路径(如误放 src/main/resources/config/ 下却没加路径前缀);
- 多个日志实现共存导致桥接混乱(检查 Maven 依赖树:mvn dependency:tree | grep log)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











