java - Spring Boot 2.1 以调试模式启动根记录器,直到横幅打印?
问题描述
这里有一些输出来举例说明我在说什么。调试消息不仅仅来自 Aspect4J 记录器,它们也来自其他几个类。我调试了应用程序,发现 Root 记录器设置为 DEBUG,然后在打印 Spring Banner 后设置为 INFO(我认为横幅与它没有任何关系)。
我的类路径上没有任何与日志记录相关的文件,除非它们是由我不知道的依赖项添加的。
我也试过设置。
# Logging
logging.level.root=INFO
logging.level.org.springframework.web=INFO
logging.level.org.hibernate=INFO
在我的 application.properties 文件中,但这没有帮助,Spring Boot 2.1 仍然在 DEBUG 级别输出所有内容,直到横幅打印。关于如何防止 Root 记录器在开始时出现 DEBUG 而不是 INFO 的任何想法都会很棒。
15:34:47.971 [main] DEBUG AspectJ Weaver - [AspectJ] not weaving 'org.springframework.boot.logging.AbstractLoggingSystem'
15:34:47.974 [main] DEBUG AspectJ Weaver - [AspectJ] not weaving 'ch.qos.logback.classic.joran.JoranConfigurator'
15:34:47.976 [main] DEBUG AspectJ Weaver - [AspectJ] not weaving 'ch.qos.logback.core.joran.JoranConfiguratorBase'
15:34:47.979 [main] DEBUG AspectJ Weaver - [AspectJ] not weaving 'ch.qos.logback.core.joran.GenericConfigurator'
15:34:47.980 [main] DEBUG AspectJ Weaver - [AspectJ] not weaving 'org.springframework.boot.logging.logback.SpringBootJoranConfigurator'
15:34:47.982 [main] DEBUG AspectJ Weaver - [AspectJ] not weaving 'ch.qos.logback.classic.spi.LoggerContextListener'
15:34:47.985 [main] DEBUG AspectJ Weaver - [AspectJ] not weaving 'ch.qos.logback.classic.turbo.TurboFilter'
15:34:47.987 [main] DEBUG AspectJ Weaver - [AspectJ] not weaving 'org.springframework.boot.logging.logback.LogbackLoggingSystem$1'
15:34:47.988 [main] DEBUG AspectJ Weaver - [AspectJ] not weaving 'org.springframework.boot.logging.LoggerConfigurationComparator'
15:34:47.989 [main] DEBUG AspectJ Weaver - [AspectJ] not weaving 'org.springframework.boot.logging.AbstractLoggingSystem$LogLevels'
15:34:48.009 [main] DEBUG AspectJ Weaver - [AspectJ] not weaving 'org.slf4j.bridge.SLF4JBridgeHandler'
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.1.RELEASE)
2018-11-21 15:34:50.094 INFO 1 --- [ main] c.s.technology.screening.SpringConfig : Starting SpringConfig on 940e73166080 with PID 1 (/web.jar started by root in /)
2018-11-21 15:34:50.100 INFO 1 --- [ main] c.s.technology.screening.SpringConfig : No active profile set, falling back to default profiles: default
2018-11-21 15:34:50.420 INFO 1 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@4e0ae11f: startup date [Wed Nov 21 15:34:50 EST 2018]; root of context hierarchy
2018-11-21 15:34:53.506 INFO 1 --- [ main] AspectJ Weaver : [AspectJ] Join point 'method-execution(org.springframework.data.domain.Page com.sasquatch.technology.screening.api.JobController.listJobs(org.springframework.data.domain.Pageable))' in Type 'com.sasquatch.technology.screening.api.JobController' (JobController.java:48) advised by around advice from 'org.springframework.security.access.intercept.aspectj.aspect.AnnotationSecurityAspect' (AnnotationSecurityAspect.aj:70)
2018-11-21 15:34:53.525 INFO 1 --- [ main] AspectJ Weaver : [AspectJ] Join point 'method-execution(com.sasquatch.technology.screening.persistence.entities.Job com.sasquatch.technology.screening.api.JobController.addJob(com.sasquatch.technology.screening.persistence.entities.Job))' in Type 'com.sasquatch.technology.screening.api.JobController' (JobController.java:54) advised by around advice from 'org.springframework.security.access.intercept.aspectj.aspect.AnnotationSecurityAspect' (AnnotationSecurityAspect.aj:70)
2018-11-21 15:34:53.620 INFO 1 --- [ main] AspectJ Weaver : [AspectJ] Join point 'method-execution(org.springframework.http.ResponseEntity com.sasquatch.technology.screening.api.TestHelperController.resetDatabase())' in Type 'com.sasquatch.technology.screening.api.TestHelperController' (TestHelperController.java:45) advised by around advice from 'org.springframework.transaction.aspectj.AnnotationTransactionAspect' (AbstractTransactionAspect.aj:66)
解决方案
我能够将问题的根源追溯到 Spring 在初始化并运行org.springframework.boot.logging.LoggingSystem
. 当 Logback 启动时,它在ch.qos.logback.classic.LoggerContext
类中默认将 Root 记录器设置为 DEBUG this.root.setLevel(Level.DEBUG)
。
我将以下代码添加到类内部的静态初始化块中,该块包含启动 Spring 应用程序的 main() 方法。获取根记录器(将其初始化为 DEBUG),然后转换为 Logback 记录器。请记住,这意味着此修复的实现与类路径上的真实日志记录实现相关联。如果我通过 log4j 或 apache commons 进行所有日志记录,那么我从中获取的记录器LoggerFactory.getLogger()
将是不同的类型,因此需要不同的演员表。这种强制转换是必要的,因为 SLF4J 外观不公开以编程方式更改日志记录级别的方法。一旦我对根记录器有了参考,然后我就设置了级别。这个级别最终会被 Spring 覆盖,所以如果我想自动保持 Spring 设置和我的初始化块相同,我需要做更多的工作。
@SpringBootApplication
public class SpringConfig {
static {
((ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).setLevel(Level.INFO);
}
}
推荐阅读
- ios - 使用 GitHub Actions 构建 iOS React Native 应用程序
- javascript - 不要在 html 中按下按钮获得价值
- python - 如何访问包含实例成员的python静态方法?
- docker - 在 Dokku 中使用 Dockerized Vue 应用程序获取环境变量
- spring-boot - 启用 Spring webclient 以通过 HTTPS 与其他启用 TLS 的服务进行通信
- python - 使用 zip() 后删除重复列表
- asp.net-core - NetCore 3.1 将 IdentityServer4 与现有数据库和用户表一起使用
- java - 单击通知时如何打开特定的卡片查看详细信息活动
- amazon-web-services - AWS 策略资源中的通配符“*”
- r - 如何在R中对包含逗号分隔数字的字符串进行排序