iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何解决spring-boot使用logback的问题
  • 786
分享到

如何解决spring-boot使用logback的问题

2023-06-20 17:06:44 786人浏览 独家记忆
摘要

这篇文章主要介绍了如何解决spring-boot使用logback的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。用ConsoleAppender.java来举例,假设在

这篇文章主要介绍了如何解决spring-boot使用logback的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

用ConsoleAppender.java来举例,假设在logback.xml中使用了该appender,那么这个类的相关的初始化方法都会调两次,如start()方法

打断点进行debug,第一次进入start()方法如下:

如何解决spring-boot使用logback的问题

可以看到所有的调用链(除了自己代码的方法)都是logback或者slf4j相关的比较正常

当跳过该断点时又会进入以此这个方法,看下调用链:

如何解决spring-boot使用logback的问题

可以看到这次的初始化是由spring-boot发起的,所以这样logback初始化一次,然后spring-boot初始化一次,一共两次

我们现在可以将spring-boot的初始化去掉

debug代码可以发现LoggingApplicationListener.java这个监听器主要是用来初始化spring-boot的日志系统,现在目的将该listener在启动之前去掉

spring-boot的启动代码为:

new SpringApplicationBuilder(Launcher.class).application().run(args);

在SpringApplicationBuilder.java的构造方法打断点进行跟踪,

进入SpringAppication.java会发现该类中的代码:

private void initialize(Object[] sources) {   if (sources != null && sources.length > 0) {      this.sources.addAll(Arrays.asList(sources));   }   this.WEBEnvironment = deduceWebEnvironment();   setInitializers((Collection) getSpringFactoriesInstances(         ApplicationContextInitializer.class));   setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));   this.mainApplicationClass = deduceMainApplicationClass();}

第八行应该就是注册监听器的地方了,继续往下跟踪,进入以下方法:

private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type,      Class<?>[] parameterTypes, Object... args) {   ClassLoader classLoader = Thread.currentThread().getContextClassLoader();   // Use names and ensure unique to protect against duplicates   Set<String> names = new LinkedHashSet<String>(         SpringFactoriesLoader.loadFactoryNames(type, classLoader));   List<T> instances = createSpringFactoriesInstances(type, parameterTypes,         classLoader, args, names);   AnnotationAwareOrderComparator.sort(instances);   return instances;}

继续进入loadFactoryNames()方法,核心就在这里了

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {   String factoryClassName = factoryClass.getName();   try {      Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :            ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));      List<String> result = new ArrayList<String>();      while (urls.hasMoreElements()) {         URL url = urls.nextElement();         Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));         String factoryClassNames = properties.getProperty(factoryClassName);         result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));      }      return result;   }   catch (IOException ex) {      throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +            "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);   }}

FACTORIES_RESOURCE_LOCATION这个常量的值为META-INF/spring.factories,

打开该文件可以发现:

# PropertySource Loadersorg.springframework.boot.env.PropertySourceLoader=\org.springframework.boot.env.PropertiesPropertySourceLoader,\org.springframework.boot.env.YamlPropertySourceLoader# Run Listenersorg.springframework.boot.SpringApplicationRunListener=\org.springframework.boot.context.event.EventPublishingRunListener# Application Context Initializersorg.springframework.context.ApplicationContextInitializer=\org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\org.springframework.boot.context.ContextIdApplicationContextInitializer,\org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\org.springframework.boot.context.web.ServerPortInfoApplicationContextInitializer# Application Listenersorg.springframework.context.ApplicationListener=\org.springframework.boot.ClearCachesApplicationListener,\org.springframework.boot.builder.ParentContextCloserApplicationListener,\org.springframework.boot.context.FileEncodingApplicationListener,\org.springframework.boot.context.config.AnsiOutputApplicationListener,\org.springframework.boot.context.config.ConfigFileApplicationListener,\org.springframework.boot.context.config.DelegatingApplicationListener,\org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener,\org.springframework.boot.logging.ClasspathLoggingApplicationListener,\org.springframework.boot.logging.LoggingApplicationListener# Environment Post Processorsorg.springframework.boot.env.EnvironmentPostProcessor=\org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\org.springframework.boot.env.SpringApplicationJSONEnvironmentPostProcessor# Failure Analyzersorg.springframework.boot.diagnostics.FailureAnalyzer=\org.springframework.boot.diagnostics.analyzer.BeanCurrentlyInCreationFailureAnalyzer,\org.springframework.boot.diagnostics.analyzer.BeanNotOfRequiredTypeFailureAnalyzer,\org.springframework.boot.diagnostics.analyzer.BindFailureAnalyzer,\org.springframework.boot.diagnostics.analyzer.NoUniqueBeanDefinitionFailureAnalyzer,\org.springframework.boot.diagnostics.analyzer.PortInUseFailureAnalyzer,\org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer# FailureAnalysisReportersorg.springframework.boot.diagnostics.FailureAnalysisReporter=\org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter

ApplicationListener应该就是我们需要修改的地方了,去掉org.springframework.boot.logging.LoggingApplicationListener就可以了,我们可以在代码里面覆盖一份这块代码从而实现去掉这行,但是实际得再跑一遍,发现还是一样初始化两次

问题出在

Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :      ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));

这块代码是将所有的META-INF/spring.factories都读取过来了然后进行合并,所以说哦这个META-INF/spring.factories只能增加内容,但是不能去掉某些内容,没办法了只能在代码初始化了所有的listener之后再将listener去掉,

具体代码如下(启动spring-boot的main方法中):

SpringApplicationBuilder builder = new SpringApplicationBuilder(Launcher.class);Set<ApplicationListener<?>> listeners = builder.application().getListeners();for (Iterator<ApplicationListener<?>> it = listeners.iterator(); it.hasNext();) {    ApplicationListener<?> listener = it.next();    if (listener instanceof LoggingApplicationListener) {        it.remove();    }}builder.application().setListeners(listeners);builder.run(args);

感谢你能够认真阅读完这篇文章,希望小编分享的“如何解决spring-boot使用logback的问题”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: 如何解决spring-boot使用logback的问题

本文链接: https://www.lsjlt.com/news/298816.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决spring-boot使用logback的问题
    这篇文章主要介绍了如何解决spring-boot使用logback的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。用ConsoleAppender.java来举例,假设在...
    99+
    2023-06-20
  • 解决spring-boot使用logback的大坑
    最近在写一个logback的kafka appender,无意中发现spring-boot在使用logback时的一个坑 用ConsoleAppender.java来举例,假设在lo...
    99+
    2022-11-12
  • 如何解决spring boot项目使用@JsonFormat失效问题
    这篇文章给大家分享的是有关如何解决spring boot项目使用@JsonFormat失效问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用@JsonFormat失效在实体类定义时间格式原因:项目中配置了fa...
    99+
    2023-06-25
  • spring boot项目使用@JsonFormat失效问题的解决
    目录使用@JsonFormat失效原因:项目中配置了fastjson包使用@JsonFormat注解踩过的坑错误原因解决方案使用@JsonFormat失效 在实体类定义时间格式 原...
    99+
    2022-11-12
  • 如何解决logback-classic使用testCompile的打包问题
    本篇内容介绍了“如何解决logback-classic使用testCompile的打包问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!lo...
    99+
    2023-06-20
  • 解决logback-classic 使用testCompile的打包问题
    logback-classic 使用testCompile的打包 今天使用gradle打包的时候logback-classic一直打包不进去。 打包logback-classic的代...
    99+
    2022-11-12
  • 如何解决gateway与spring-boot-starter-web冲突问题
    本篇内容介绍了“如何解决gateway与spring-boot-starter-web冲突问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2023-06-20
  • 如何解决通过spring-boot-maven-pluginpackage失败问题
    目录1.pom文件示例2.执行mvn package出现异常3.异常堆栈详细信息4.主要问题概述5.解决方案6.修改后pom文件7.再次执行mvn package问题解决总结1.po...
    99+
    2023-05-15
    spring-boot-maven-plugin package失败 spring-boot-maven-plugin package
  • 基于Spring Boot的线程池监控问题如何解决
    这篇文章主要介绍“基于Spring Boot的线程池监控问题如何解决”,在日常操作中,相信很多人在基于Spring Boot的线程池监控问题如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-29
  • gateway与spring-boot-starter-web冲突问题的解决
    gateway与spring-boot-starter-web 冲突 环境: SpringCloud 版本 ---- Finchley.SR2 SpringBoot 版本 ---- ...
    99+
    2022-11-12
  • 解决spring boot环境切换失效的问题
    目录spring boot环境切换失效概述解决springboot多环境配置文件无效springboot配置文件无效spring boot环境切换失效 概述 最近在使用-Dsprin...
    99+
    2022-11-12
  • Springboot的spring-boot-maven-plugin导入失败的问题如何解决
    本篇内容介绍了“Springboot的spring-boot-maven-plugin导入失败的问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,...
    99+
    2023-06-20
  • spring boot使用@Async注解解决异步多线程入库的问题
    目录前言项目实况介绍第一种方式第二种方式这里有个坑!这里有两个坑!总结前言 在开发过程中,我们会遇到很多使用线程池的业务场景,例如定时任务使用的就是ScheduledThreadPo...
    99+
    2022-11-13
  • Spring Boot如何使用logback、logstash、ELK记录日志文件
    这篇文章主要介绍Spring Boot如何使用logback、logstash、ELK记录日志文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Spring Boot 下,尝试使用 log4j 记录日志到 logst...
    99+
    2023-05-30
    logback logstash spring
  • spring boot自带的page分页问题怎么解决
    这篇“spring boot自带的page分页问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“sprin...
    99+
    2023-06-29
  • 解决spring boot 1.5.4 配置多数据源的问题
    spring boot 已经支持多数据源配置了,无需网上好多那些编写什么类的,特别麻烦,看看如下解决方案,官方的,放心!1.首先定义数据源配置#=====================multiple database config===...
    99+
    2023-05-31
    springboot 多数据源 配置
  • 如何解决Spring boot 和Vue开发中CORS跨域问题
    这篇文章主要介绍如何解决Spring boot 和Vue开发中CORS跨域问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 遇到的问题:我用spring-boot 做Rest服...
    99+
    2022-10-19
  • Spring Boot如何解决Redis缓存+MySQL批量入库问题
    这篇文章给大家分享的是有关Spring Boot如何解决Redis缓存+MySQL批量入库问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。架构设计架构图:时序图记录基础数据MySQL表结构CREATE...
    99+
    2023-06-29
  • 解决Spring使用@MapperScan问题
    目录问题场景问题根源问题追溯问题解决SpringBoot  @MapperScan的注意事项问题场景 今天小编在MyBatis 整合Spring 的时候,使用到了@Mapp...
    99+
    2022-11-12
  • logback日志文件路径问题如何解决
    这篇文章给大家介绍logback日志文件路径问题如何解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。对于J2SE项目,当前路径为工程所在目录如我的工程为:D:\test则使用…/logs生成的日志文件位于:D:\lo...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作