【IDEA】gradle + log4j2 + slf4j 报错

在尝试将Spring Boot项目的日志系统从logback切换到log4j2时遇到SLF4J错误。通过在build.gradle中排除logback相关依赖并引入log4j2依赖,但在IDEA中执行时仍然出现问题。执行gradle clean build && gradle bootRun命令后,问题得到解决,推测可能是IDEA的依赖缓存导致。解决方案是清理IDEA缓存并重新构建项目。

  在项目中,想要使用 log4j2 而移除了默认的 logback 日志系统,但是在 IDEA 上无论如何执行,都显示下面的错误。然后日志信息就停止了。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details

配置如下:

build.gradle:

configurations {
	all {
		/// 在所有项目中移除 默认的 logging
		exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
		exclude module: 'logback-classic'
		exclude module: "logback-core"
	}
}

dependencies {
	implementation "org.springframework.boot:spring-boot-starter-log4j2:${version_spring}"

	implementation "org.springframework.boot:spring-boot-starter-data-jpa:${gradle.ext.version_spring}"
	implementation "org.springframework.boot:spring-boot-starter-security:${gradle.ext.version_spring}"
	implementation "org.springframework.boot:spring-boot-starter-web:${gradle.ext.version_spring}"
	implementation "org.springframework.boot:spring-boot-starter-websocket:${gradle.ext.version_spring}"

	runtimeOnly 'org.postgresql:postgresql:42.2.24.jre7'

	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
}

settings.gradle:

gradle.ext.version_spring="2.5.5"

解决方法:

请添加图片描述
  这是在命令行中执行了 gradle clean build && gradle bootRun 命令后,没有出现该错误。
  猜测原因是因为 IDEA 的缓存依赖等问题。重新手动更新一下就好了。

### 使用 @Slf4j 注解时 log 变量不存在的错误解决方法 在使用 Lombok 提供的 `@Slf4j` 注解时,如果出现 `log` 变量不存在的错误,通常是因为以下原因之一导致的。以下是可能的原因及解决方案: #### 1. **Lombok 未正确配置** Lombok 是一个依赖库,用于简化 Java 开发中的样板代码。如果项目中未正确引入 Lombok 或 IDE 未正确配置 Lombok 支持,则可能导致编译器无法识别 `@Slf4j` 注解生成的 `log` 变量。 - 确保项目中已添加 Lombok 依赖。例如,在 Maven 的 `pom.xml` 文件中添加以下内容: ```xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <!-- 版本号根据实际情况调整 --> <scope>provided</scope> </dependency> ``` - 如果使用的是 Gradle 构建工具,请在 `build.gradle` 文件中添加: ```gradle dependencies { compileOnly 'org.projectlombok:lombok:1.18.24' // 版本号根据实际情况调整 annotationProcessor 'org.projectlombok:lombok:1.18.24' } ``` - 配置 IDE 支持 Lombok: - 在 IntelliJ IDEA 中,确保启用了 Lombok 插件。可以通过 `File -> Settings -> Plugins` 搜索并安装 Lombok 插件。 - 启用注解处理功能:`File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors`,勾选“Enable annotation processing”。 #### 2. **编译器未正确处理 Lombok 注解** 即使正确配置了 Lombok,某些情况下编译器可能未能正确处理注解。这可能是由于缓存问题或构建工具配置不正确导致的。 - 清理并重新构建项目: - 在 IntelliJ IDEA 中,可以尝试 `File -> Invalidate Caches / Restart` 来清除缓存。 - 使用命令行执行 `mvn clean install` 或 `gradle clean build` 来重新构建项目。 #### 3. **类路径问题** 如果 `@Slf4j` 注解所在的类未被正确加载到类路径中,也可能导致 `log` 变量不可用。 - 确保 `@Slf4j` 注解的类被正确编译并包含在最终的 JAR 文件或运行环境中。 - 如果使用的是 Spring Boot 项目,确保主类上添加了 `@SpringBootApplication` 注解,并且相关组件被正确扫描。 #### 4. **日志框架冲突** Lombok 的 `@Slf4j` 注解默认生成基于 SLF4J 的日志对象。如果项目中存在多个日志框架(如 Log4j、Commons Logging 等),可能会导致冲突。 - 确保项目中仅使用一个日志框架。例如,如果使用 SLF4J,请确保以下依赖已正确配置: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.32</version> <!-- 版本号根据实际情况调整 --> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.6</version> <!-- 版本号根据实际情况调整 --> </dependency> ``` #### 示例代码 以下是一个正确的示例代码,展示了如何使用 `@Slf4j` 注解和 `log` 变量: ```java import lombok.extern.slf4j.Slf4j; @Slf4j public class FileTest { public static void main(String[] args) { log.info("hello"); // 正确输出日志信息 } } ``` 编译后,Lombok 会自动为该类生成如下代码[^2]: ```java public class FileTest { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(FileTest.class); public static void main(String[] args) { log.info("hello"); } } ``` ### 注意事项 如果上述步骤均已完成,但问题仍然存在,请检查以下内容: - 确保 JDK 版本与项目兼容。 - 确保 IDE 和构建工具版本是最新的。 - 确保项目中未禁用 Lombok 注解处理器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值