Spring Boot - 在部署为WAR时从WEB-INF /文件夹加载'logback.xml'

时间:2016-07-13 17:28:15

标签: spring-mvc spring-boot logback

我正在努力将传统的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处理此问题的正确方法是什么? (欢迎使用示例代码)

2 个答案:

答案 0 :(得分: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中类路径的位置。

虽然,老实说,我宁愿在logback.xmlsrc/main/webapp/WEB-INF/作为classes/logback.xml的符号链接(这对于部署是有意义的(并且在您的远程中有用)安装),因为webapp/WEB-INF/logback.xml将链接到webapp/WEB-INF/classes/logback.xml)并通过将logback.xml放入src/main/resourceswebapp/WEB-INF/classes/中复制$SerialOutput来保持我的spring-boot应用程序更加传统1}})。由于我不知道您的远程安装的具体情况以及兼容性的含义,这可能会也可能不起作用。

答案 1 :(得分: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>

<{1}}中的 logback-include.xml ,它有一些常见的配置:

src/main/resources

最后,导入公共配置的<?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> 中的logback.xml就像logback-spring.xml一样:

src/main/webapp/WEB-INF