如何在Spring Boot中禁用日志自动配置?

4

Spring Boot具有自动检测可用的任何日志框架的功能(基于列在org.springframework.boot.logging.LoggingSystem.SYSTEMS中的类的存在-Logback、Log4j或JUL),并从应用程序提供的日志配置文件或Spring Boot自己的默认配置文件(打包在Spring Boot中)中进行配置。

当将Grails 3应用程序部署为war文件到JBoss EAP 6(又名WildFly 7)时,这会导致问题。 当应用程序初始化时,Spring Boot会找到JUL的JBoss提供的日志实现 (org.jboss.logmanager.LogManager),并调用它的readConfiguration()方法,这会破坏日志配置。

  • 我想继续使用JBoss提供的日志实现和JBoss提供的日志配置,而不是在我的war文件中打包一个单独的日志实现。这使我能够从服务器配置文件中配置所有我的应用程序。
有没有办法禁用Spring Boot的日志自动配置? (我可以接受Spring Boot检测和使用日志框架;我只是不想让它尝试配置它。)我已经查看了源代码,但没有看到任何控制这个的钩子。

相关源代码:

可能的想法:

  • 如何在 LoggingApplicationListener 接收到 ApplicationStartedEventApplicationEnvironmentPreparedEvent 事件之前,从应用监听器列表中删除它(这会触发日志配置)?

这些相关问题无法解决我的问题,因为使用情况不同:

版本:

  • Spring Boot - 1.3.3.RELEASE
  • Grails - 3.1.5
2个回答

5
在Spring Boot 1.3.x中,您可以编写一个自定义实现org.springframework.boot.logging.LoggingSystem的类,该类不执行任何操作,然后将org.springframework.boot.logging.LoggingSystem系统属性设置为您自定义实现的完全限定类名。
在Spring Boot 1.4.x中,无需使用自定义实现,您只需将org.springframework.boot.logging.LoggingSystem系统属性设置为none即可。

如果我使用这条路线,Spring Boot 是否会停止记录任何内容?还是它会写入标准输出? - GreenGiant
1
它将通过对Commons Logging的调用继续记录。只要您的应用程序服务器支持Commons Logging或使用类似于SLF4J的Commons Logging替代品,它将根据您的应用程序服务器的日志配置记录到您想要的任何位置。 - Andy Wilkinson
我应该在哪里设置这个环境属性?我正在将其部署到 JBoss EAP 6 中作为 war 包,如果可能的话,我不想将其设置为服务器上的全局系统属性。是否有方便的方法在应用程序本身或某个属性文件中设置它?(这是一个 Grails 3 应用程序) - GreenGiant
很遗憾,必须是系统属性。 - Andy Wilkinson
1
哇,看起来这对于那些部署应用程序到应用服务器的人来说是一个常见的用例。我很惊讶它不能更容易地针对每个应用程序进行配置,特别是考虑到Spring Boot在许多其他方面都非常容易定制化。 - GreenGiant
也许你可以贡献一些改进? - Andy Wilkinson

1
这不是一个具体的答案,而是一些线索,你告诉我是否有帮助:
你看到了吗?如何配置Spring-Boot + JBOSS 7.1服务器的日志记录
此外,在Spring Boot 1.4中进行了修复(如果修复了问题并且您有升级选项):Spring Boot日志初始化
我对修复的理解是:它延迟了记录器的初始化,使您能够以编程方式定义java.util.logging.manager:
System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接