Spring-Boot部署为.war文件时的日志配置

14

我有一个简单的spring-boot应用程序,被打包成war文件,可以部署到外部的Tomcat容器中。我在类路径(/WEB-INF/classes)下有一个logback.xml(如下),但是当部署到Tomcat时,日志没有被写入文件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <logger name="org.springframework.web" level="DEBUG"/>
</configuration>

1
如果你确定找不到 spring.log 文件(在默认的临时目录下),那么尝试在启动 Tomcat 时显式设置系统属性 LOG_FILE,并确保该目录对 Tomcat 是可写的。 - Hille
1个回答

31

我一直在努力解决可能是同样问题的困扰 - 单元测试和运行应用程序“main()”方法时日志记录正常,但在tomcat中它完全忽略了我的配置。

事实证明,在启动时,tomcat设置了一个环境变量“LOGGING_CONFIG”,用于描述其“logging.properties”文件的位置。这可以在tomcat/bin/catalina.sh或(.bat)中看到。

Spring Boot也在启动时读取环境变量,并作为其智能处理配置的一部分,我相信它将LOGGING_CONFIG转换为“logging.config”,这是它用来允许您覆盖其日志配置位置的属性。

问题在于它然后尝试将该值视为文件名并加载它(它实际上不是文件名,而是描述文件的Java系统属性),但它失败了,并且没有正确初始化其日志记录,并继续使用Tomcat默认设置。

解决方案似乎是确保首先设置环境变量,例如像以下内容一样(您的 IDE 应该有此选项 - 在 Intellij 中,转到 Run -> Edit Configurations -> Environment Variables -> 输入以下名称和值):

set logging.config=classpath:/logback.xml

相比于Tomcat的LOGGING_CONFIG,Spring Boot将优先使用此设置,并且将按预期工作。

然而,到目前为止,我尝试过无法从类似application.properties这样的配置文件中使其工作,这意味着这是针对部署在该Tomcat实例上的所有应用程序的全局设置。

编辑:这将是由于环境变量会覆盖本地配置,在除此之外的每种情况下都是您想要的 :-(

编辑2:我可以确认,截至Spring Boot 1.1.6,已经解决了此问题-它被记录为警告,并且它将继续使用现有(和正确的)日志记录配置。不幸的是,您无法在logback.xml文件中禁用警告消息本身。


4
哇,我打赌那需要一些追踪。 - Dave Syer
1
Github上有一些关于如何处理此问题的讨论:https://github.com/spring-projects/spring-boot/issues/1432。 - Dave Syer
2
我正在遇到相同的问题(tomcat的LOGGING_CONFIG优先),但我仍希望利用在application.properties中设置的logging.config参数,该参数指向与默认位置(即classpath:logback.xml)不同的位置。有可能的解决方案吗? - mjj1409
1
在IntelliJ中你在哪里设置这个? - powder366
@powder366 我已经更新了我的答案来涵盖这个问题(从记忆中)。 - Patrick Herrera

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