【问题标题】:Spring Boot logging before app starts on external Tomcat应用程序在外部 Tomcat 上启动之前的 Spring Boot 日志记录
【发布时间】:2018-09-07 10:39:00
【问题描述】:

每当 Spring Boot 应用程序即将启动时,我都会尝试进行一些日志记录。

目前我有一个实现ApplicationEnvironmentPreparedEvent 的类,我在SpringBootApplication 的主函数中将其注册为监听器。

Application.java:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    private static final Logger appLogger = LoggerFactory.getLogger(Application.class);
    public static void main(String[] args) {
        System.out.println("INIT");
        appLogger.info("Initializing");

        SpringApplication sa = new SpringApplication();
        sa.addListeners(new InitializationLogger());
        sa.setSources(new HashSet<>(Collections.singletonList(Application.class)));
        sa.run(args);

        appLogger.info("--Application Started--");
    }
}

InitializationLogger.java

public class InitializationLogger implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
    private static final Logger appLogger = LoggerFactory.getLogger(InitializationLogger.class);

    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        System.out.println(event.getClass());
        appLogger.info(this.getClass().getName());
    }
}

问题是,每当我通过 Intellij 的 SpringBoot 运行器或命令行作为胖 jar 运行应用程序时,它都可以正常工作,但是当我将其部署到外部 Tomcat 时,这些日志不会显示(所有其他应用程序日志工作正常)。

我该怎么做?

【问题讨论】:

  • 你检查过tomcat日志吗?
  • @PrabinPaudel 是的,那里也没有日志

标签: java spring spring-boot log4j2


【解决方案1】:

我该怎么做?

覆盖SpringBootServletInitializer.configure,类似于:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    private static final Logger appLogger = LoggerFactory.getLogger(Application.class);

    // for JAR deploy:
    public static void main(String[] args) {
        SpringApplicationBuilder builder = configureSpringBuilder(new SpringApplicationBuilder());
        builder.application().run(args);
        appLogger.info("--Application Started--");
    }

    // for WAR deploy:
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return super.configure(configureSpringBuilder(builder));
    }

    // Common:
    private static SpringApplicationBuilder configureSpringBuilder(SpringApplicationBuilder builder) {
        System.out.println("INIT");
        appLogger.info("Initializing");

        builder.application().addListeners(new InitializationLogger());
        builder.application().setSources(new HashSet<>(Collections.singletonList(Application.class)));

        return builder;
    }
}

参考资料:

  1. Class SpringBootServletInitializer

    要配置应用程序,请覆盖 configure(SpringApplicationBuilder) 方法 (...)

  2. Tutorial: Use Spring Boot to Build and Deploy WAR Files - Setting Up a Servlet

    要将应用设置为 servlet,我们使用 SpringBootServletInitializer 扩展主类并使用 SpringApplicationBuilder 覆盖配置方法。

  3. Deploying Spring Boot Applications - What about the Java EE Application Server?

    因此修改您的应用程序入口点类 (...)

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2017-07-17
    • 2018-02-27
    相关资源
    最近更新 更多