【问题标题】:Spring Boot - Loading 'logback.xml' from the WEB-INF/ folder when deploying as WARSpring Boot - 部署为 WAR 时从 WEB-INF/ 文件夹加载“logback.xml”
【发布时间】:2016-07-13 17:28:15
【问题描述】:

我正在努力将传统的 Spring MVC 应用程序更新为 Spring Boot(部署为 WAR)。

一个要求是,为了保持与我们的远程安装的兼容性,logback.xml 文件需要位于部署的 webapp 中的以下位置:

webapp/WEB-INF/logback.xml

在项目源中,如果我将文件放在src/main/webapp/WEB-INF/logback.xml,它会成功复制到webapp/WEB-INF/logback.xml,但我找不到从该位置加载和使用它的方法。

我尝试将 Spring Boot logging.config 属性设置为以下内容:

logging.config=/WEB-INF/logback.xml

希望自动配置能够解决这个问题,但这会失败且不会显示错误消息,而是会加载默认的 Spring Boot 日志配置。

使用 Spring Boot 处理此问题的正确方法是什么? (欢迎使用示例代码)

【问题讨论】:

  • 我认为问题与 Spring Boot 无关,而是/WEB-INF 不在类路径上,只有/WEB-INF/classes。 Logback 尝试在类路径中查找 xml。如果无法将文件移动到classes,则需要弄清楚如何将 /WEB-INF 添加到类路径中。不确定是否有一种简单且独立于应用程序服务器的方法来做到这一点。谷歌war custom classpath 你会看到的。
  • 我认为问题与 Spring Boot 无关,而是/WEB-INF 不在类路径上,只有/WEB-INF/classes。 Logback 尝试在类路径中查找 xml。如果无法将文件移动到classes,则需要弄清楚如何将 /WEB-INF 添加到类路径中。不确定是否有一种简单且独立于应用程序服务器的方法可以做到这一点。谷歌war custom classpath 你会看到的。

标签: spring-mvc spring-boot logback


【解决方案1】:

事实证明这需要破解:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    // In case of regular deployments, use WEB-INF/logback.xml
    @Override 
    public void onStartup(final ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        configureLogging(servletContext);
        LoggerFactory.getLogger(getClass()).info("Done configuring");
    }

    // manually configure logging
    private void configureLogging(final ServletContext servletContext) {
        try {
            String realPath = servletContext.getRealPath("/WEB-INF/logback.xml");
            LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
            JoranConfigurator configurator = new JoranConfigurator();
            configurator.setContext(context);
            context.reset();
            configurator.doConfigure(realPath);
        } catch (JoranException je) {
            // StatusPrinter will handle this
        }
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

}

另外,我在src/main/resources 中有 logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="logback-include.xml" />
</configuration>

src/main/resources中的logback-include.xml,有一些共同的配置:

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

    <!-- put your loggers here -->
    <logger name="org.springframework.web" additivity="false" level="INFO">
        <appender-ref ref="CONSOLE"/>
    </logger>

    <!-- put your root here -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</included>

最后,src/main/webapp/WEB-INF 中的 logback.xml 像 logback-spring.xml 一样导入了通用配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="logback-include.xml" />
</configuration>

【讨论】:

  • 这会导致以下警告消息:|-WARN in ch.qos.logback.core.joran.action.IncludeAction - Could not find resource corresponding to [/WEB-INF/logback.xml]
  • 至于第二部分-我理解引用文档的方式是,仅使用 @PropertySources 注释不起作用-“常规”外部配置(f.i.通过 application.properties 设置属性,就像我正在尝试的那样)应该根据报价工作。不过我可能是误会了。 :)
  • 嗯,我觉得你是对的,我刚试过。而且我也认为亚瑟对你的问题的评论也是正确的——在我的回答中,我没有尝试部署工件,我只是通过 mvn spring-boot:run 运行它,它在那里运行良好;但是,它在部署时不起作用。我会用解决方案更新我的答案
  • 有点难看,但是嘿 - 如果你不能自动连接它们,加入他们! :) 我最终实现了一个更简单的版本,在WEB-INF 文件夹中只有一个logback.xml,所有配置都发生在ApplicationListener&lt;ContextRefreshedEvent&gt; 而不是onStartup 方法中。
  • 它不会在部署外部 tomcat 的战争中调用
【解决方案2】:

logback.xml 放入src/main/webapp/WEB-INF/ 会导致文件被复制到webapp/WEB-INF/,这是类路径上webapp/WEB-INF/classes/ 之上的目录级别。试着把它放在你的application.properties

logging.config=classpath:../logback.xml

这样logback.xml 将在初始化期间正确定位。看看Common Application Properties,例如classpath: 的用法,它用于表示application.properties 中类路径的位置。

虽然,老实说,我宁愿在src/main/webapp/WEB-INF/ 中将logback.xml 设为classes/logback.xml 的符号链接(这对部署很有意义(并且在您的远程安装中很有用),因为@987654334然后@ 将链接到webapp/WEB-INF/classes/logback.xml)并通过将logback.xml 放入src/main/resources(将被复制到webapp/WEB-INF/classes/)使我的spring-boot 应用程序更加传统。由于我不知道您的远程安装的具体细节以及您所说的兼容性是什么意思,所以这可能有效,也可能无效。

【讨论】:

  • 设置logging.config=classpath:../logback.xml 也会静默失败。符号链接建议很有趣,但可能不适用于我们的案例。
  • @vtosh “静默”是什么意思?就像logging.config=/WEB-INF/logback.xml 对你来说失败了,那就是加载了默认的日志配置?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2020-11-03
相关资源
最近更新 更多