Lorg/apache/logging/log4j/Logger 报错

本文介绍了如何解决因缺少Log4j相关jar包导致的问题,包括需要补全的具体依赖项如commons-logging、slf4j-api、log4j、log4j-web等。

解决办法:

     将log4j的jar包补全


一般需要:

commons-logging-x.x.x.jar

slf4j-api-x.x.x.jar

log4j.jar

log4j-web-x.x.x.jar

log4j-core-x.x.x.jar

log4j-api-x.x.x.jar

### 回答问题:`@Slf4j` 和 `@Log4j2` 的使用方法与区别 在 Java 开发中,日志是调试、监控和排查问题的重要工具。Lombok 提供了多个注解来自动生成日志对象,其中最常用的是 `@Slf4j` 和 `@Log4j2`。它们都能简化日志代码的编写,但底层使用的日志框架不同。 --- #### ✅ 一、`@Slf4j` 使用详解(推荐) `@Slf4j` 是 Lombok 提供的注解,用于自动生成一个基于 **SLF4J(Simple Logging Facade for Java)** 的静态日志对象 `log`。 > 🔹 底层依赖: - SLF4J 是门面模式(Facade),不直接实现日志功能 - 实际日志实现由绑定的框架完成(如 Logback、Log4j2) ##### 1. 添加依赖(Maven) ```xml <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency> <!-- SLF4J API + 具体实现(以 Logback 为例) --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.4.11</version> </dependency> ``` > 💡 Spring Boot 项目默认已包含 `spring-boot-starter-logging`,它内置了 SLF4J + Logback,无需额外引入。 ##### 2. 使用示例 ```java import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @Slf4j @Service public class UserService { public void createUser(String name) { log.info("开始创建用户: {}", name); if (name == null || name.isEmpty()) { log.error("用户名不能为空"); return; } log.debug("执行数据库插入操作..."); // 模拟业务逻辑 log.info("用户 [{}] 创建成功", name); } } ``` > 自动生成等价代码: ```java private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserService.class); ``` ##### 3. 日志级别说明(从低到高) | 级别 | 用途 | |------|------| | `TRACE` | 最详细信息,用于追踪流程 | | `DEBUG` | 调试信息,开发时使用 | | `INFO` | 关键业务流程记录 | | `WARN` | 警告,可能有问题但不影响运行 | | `ERROR` | 错误,出现异常或失败操作 | 用法: ```java log.trace("进入方法 trace"); log.debug("当前用户: {}", user); log.info("任务完成"); log.warn("配置文件未找到,使用默认值"); log.error("保存用户失败", exception); // 可传入 Throwable ``` --- #### ✅ 二、`@Log4j2` 使用详解 `@Log4j2` 是 Lombok 注解,用于生成基于 **Apache Log4j2** 的日志对象。 > 🔹 特点: - 性能高,支持异步日志(Async Logger) - 更适合高并发场景 - 需要显式排除其他日志框架避免冲突 ##### 1. 添加依赖(Maven) ```xml <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency> <!-- Apache Log4j2 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.23.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j2-impl</artifactId> <version>2.23.1</version> </dependency> <!-- 排除 Spring Boot 默认的 Logback --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> ``` ##### 2. 使用示例 ```java import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; @Log4j2 @Service public class OrderService { public void processOrder(Long orderId) { log.info("处理订单: {}", orderId); try { // 模拟业务 Thread.sleep(100); } catch (InterruptedException e) { log.error("订单处理被中断", e); } log.info("订单 {} 处理完成", orderId); } } ``` > 自动生成等价代码: ```java private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(OrderService.class); ``` ##### 3. 配置文件:`log4j2.xml` 放在 `src/main/resources/log4j2.xml` ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> </Console> <File name="File" fileName="logs/app.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"/> </File> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> <AppenderRef ref="File"/> </Root> </Logers> </Configuration> ``` --- #### ✅ 三、`@Slf4j` vs `@Log4j2` 对比 | 特性 | `@Slf4j` | `@Log4j2` | |------|---------|----------| | 所属门面 | SLF4J(通用门面) | 直接对接 Log4j2 实现 | | 默认实现 | 通常为 Logback | Apache Log4j2 | | 性能 | 好 | 更好(尤其异步日志) | | 易用性 | 简单,Spring Boot 默认支持 | 需要手动排除旧日志框架 | | 异步日志支持 | 依赖实现(如 AsyncAppender in Logback) | 原生支持 `AsyncLogger` | | 推荐场景 | 普通项目、Spring Boot 默认集成 | 高并发、对性能要求高的系统 | --- #### ✅ 四、选择建议 | 场景 | 推荐方案 | |------|----------| | Spring Boot 项目,默认即可用 | ✅ 使用 `@Slf4j` | | 已有 Logback 配置,不想改 | ✅ `@Slf4j` | | 追求极致性能,需要异步日志 | ✅ `@Log4j2` | | 使用云原生、微服务架构 | ✅ `@Slf4j + Logback` 或 `@Log4j2`(看团队规范) | --- #### ✅ 五、常见问题解决 ##### ❌ 问题1:编译时报错 `Cannot resolve symbol 'log'` 原因: - Lombok 插件未安装或未启用 解决方案: - IntelliJ IDEA:Settings → Plugins → 安装 "Lombok" - 启用注解处理:Settings → Build → Compiler → Annotation Processors → ✔ Enable annotation processing ##### ❌ 问题2:日志输出乱码(中文乱码) 解决方式(在 `logback-spring.xml` 中设置编码): ```xml <encoder> <charset>UTF-8</charset> <pattern>%d %p %c{1.} [%t] %m%n</pattern> </encoder> ``` ##### ❌ 问题3:同时存在多个日志框架导致冲突 现象: - 控制台重复打印日志 - 报错 “multiple binding” 解决: - 排除多余的日志实现,只保留一个 ```xml <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> <!-- 改用 log4j2-starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值