当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:LoggingApplicationListener干扰应用服务器日志记录

郎言
2023-03-14

Spring Boot使用<code>LoggingApplicationListener<code>自动初始化底层日志记录系统。如果我正在开发的应用程序独立运行或独立运行,这是一件好事。

然而,我正在开发一个web应用程序,该应用程序将部署到WSO2应用程序服务器中,该服务器提供统一的日志记录(使用log4j),具有中央日志级别管理(在运行时通过web界面)、业务报告等功能。

如果我使用Spring Boot“原样”,它会完全独立记录所有内容。我的第一个尝试是删除<code>spring boot starter日志记录。这在某种程度上是可行的,因为<code>LoggingApplicationListener<code>现在覆盖了WSO2提供的全局日志管理器的设置(甚至导致全局附加器关闭)。

我想到的唯一“解决方案”是通过反射移除监听器。然后,Spring Boot开始完全按照它应该的方式运行(通过全局日志程序进行日志记录,并且不覆盖预定义的日志级别、输出格式、附加器等。)

这个“解决方案”看起来像这样:

@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {

    public static void main(String... args) {
        SpringApplication.run(MyApp.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        try {
            Field appField = SpringApplicationBuilder.class.getDeclaredField("application");
            appField.setAccessible(true);
            SpringApplication app = (SpringApplication)appField.get(builder);

            Field listenersField = SpringApplication.class.getDeclaredField("listeners");
            listenersField.setAccessible(true);
            List<ApplicationListener<?>> listeners = (List<ApplicationListener<?>>) listenersField.get(app);
            for (int i = listeners.size() - 1; i >= 0; --i) {
                if (listeners.get(i) instanceof LoggingApplicationListener) {
                    listeners.remove(i);
                }
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return builder.sources(MyApp.class);
    }
}

对于我的问题,有没有更好的解决方案,可能是我在研究和代码分析过程中忽略的不那么复杂?

共有2个答案

边健
2023-03-14

从Spring Boot 1.4开始,可以禁用日志系统自动配置。

查看Spring文档的自定义日志配置部分:

您可以使用<code>org.springframework.Boot.logging来强制Spring Boot使用特定的日志系统。LoggingSystemsystem属性。该值应该是LoggingSystem实现的完全限定类名。您还可以使用<code>none<code>的值完全禁用Spring Boot的日志记录配置。

例如,对于Tomcat,设置环境变量JAVA_OPTS

JAVA_OPTS="-Dorg.springframework.boot.logging.LoggingSystem=none"
宋奇希
2023-03-14

谢谢你的帖子,它很有帮助。我在Websphere Aplication Server上遇到了同样的问题:在spring boot context初始化之后,我没有更多的日志。通过覆盖SpringBootServletInitializer的run方法,这种解决方案是等效的,但不那么脏:

@Override
    protected WebApplicationContext run(SpringApplication application) {
        Collection<ApplicationListener<?>> listeners =
                new ArrayList<>();
        for (ApplicationListener<?> listener: application.getListeners()) {
            if (!(listener instanceof LoggingApplicationListener)) {
                listeners.add(listener);
            }
        }
        application.setListeners(listeners);
        return super.run(application);
    }
 类似资料:
  • 我知道有很多关于这个的问题,但是我确实经历了所有的问题,并且有点困惑自己,我列出了我遵循的步骤,请让我知道我把它搞砸了。 1) 我只想在应用程序级别使用Log4j,所以需要复制WL_HOME/server/lib/wllog4j。jar和log4j。jar在Domail_Home/Lib? 2) 我使用的是Maven,我在pom中添加了Log4j依赖项。xml[war]。我把战争藏在耳朵里。 3)

  • 我创建了一个Grails 2.4.5应用程序(),并在下添加了大量Groovy类。对于任何需要日志记录的类,我使用了注释,如下所示: Grails生成的类也是如此,比如控制器和服务(也就是说,我使用<code>@Slf4j</code>注释处理所有事情)。我终于可以在本地运行<code>myapp 这是我在中的日志配置: 我知道Grails使用log4j,但是我认为Grails自带SLF4J绑定,

  • 我目前正在使用Azure'Web应用Linux',它利用docker容器通过私有注册表(Azure容器注册表)托管java应用和python应用,我还没有找到收集和分析应用程序日志的方法容器。 目标是通过OMS、application insight或storage analytics分析应用程序日志。我知道“linux上的Web应用程序”仍处于预览状态,但没有关于当前支持哪些功能的官方文档。 A

  • 我刚刚为我们的微服务环境在前端创建了简单的Zuul代理,但现在我想将所有条目记录到通过代理的日志文件中。 做任何我需要做的事情。

  • 我有一个服务可以把不必要的信息记录到journald上。这个能完全关掉吗? 我试着用log4j完成它。属于该服务但没有帮助的属性

  • 如何监控LMAX Disruptor?假设我有3个环缓冲区,并希望提供一个用户界面来提供环缓冲区的信息。