当前位置: 首页 > 后端技术 > Java

记得一个logback配置文件不生效问题排查

时间:2023-04-01 22:13:31 Java

问题描述最近在公司新建了一个JAVA微服务,使用springboot框架,使用logback作为日志模块的实现。在搭建的过程中,想起在文档中看到springboot支持使用logback-spring.xml作为自定义的logback配置文件。该文件中可以使用Spring自定义的标签。例如,日志文件可以根据当前生效的配置文件进行配置,从而无需配置多个日志文件并在配置文件中指定具体的当前生效配置。看完教程,我在resources目录下新建了一个logback-spring.xml配置文件,内容如下:${FILE_LOG_PATTERN}${LOG_BASE}/application.log${LOG_BASE}/application.log-%d{yyyy-MM-dd}.%i500MB6020GB${FILE_LOG_PATTERN}0512${LOG_BASE}/application-error.log${LOG_BASE}/application-error.log-%d{yyyy-MM-dd}.%i500MB6020GB${FILE_LOG_PATTERN}错误0512这个配置文件主要关注springProfile这个标签,它是一个自定义的spring标签,根据当前生效的profile决定使用哪一段配置。这里,当effectiveprofile=local或boe时,使用上面一段配置,否则使用下面一段配置。本质上,希望在测试环境中将日志的级别调整为DEBUG,而在生产环境中,将级别调整为INFO并将ERROR日志专门输出到ERROR文件中,方便排错。但是在测试的过程中,发现这个配置并没有生效。ERROR文件也被打印在测试环境中。在调查过程中询问谷歌无果后,通过中断启动应用程序的时间点进行调查。Springboot通过org.springframework.boot.logging.logback.LogbackLoggingSystem类在应用启动时解析logback配置文件。该类是LoggingSystem类的子类,在LoggingSystem类下还有其他子类,包括JavaLoggingSystem、Log4j2LoggingSystem等,以支持不同的日志模块。当应用启动时,spring会调用org.springframework.boot.logging.AbstractLoggingSystem#initialize方法初始化日志系统。如果在配置文件中指定了配置的位置(通过logging.file),则根据指定的目录搜索并加载配置,否则将扫描项目并根据默认配置路径搜索配置文件不同的日志系统。publicvoidinitialize(LoggingInitializationContextinitializationContext,StringconfigLocation,LogFilelogFile){//指定配置文件目录if(StringUtils.hasLength(configLocation)){initializeWithSpecificConfig(initializationContext,configLocation,logFile);返回;}//从默认路径搜索配置文件initializeWithConventions(initializationContext,logFile);}privatevoidinitializeWithSpecificConfig(LoggingInitializationContextinitializationContext,StringconfigLocation,LogFilelogFile){//根据目录加载日志文件configLocation=SystemPropertyUtils.resolvePlaceholders(configLocation);loadFileConfiguration(initial)Context,text进入initializeWithConventions后,会先扫描不同日志系统定义的默认配置路径,找到配置文件(getSelfInitializationConfig)。getSelfInitializationConfig方法中调用getStandardConfigLocations获取默认配置路径if(config!=null&&logFile==null){//自初始化已经发生,在属性更改的情况下重新初始化reinitialize(initializationContext);返回;}//如果classpath中没有找到默认的配置文件,则寻找spring自定义的配置文件if(config==null){config=getSpringInitializationConfig();}if(config!=null){loadConfiguration(initializationContext,config,logFile);返回;}loadDefaults(initializationContext,logFile);}protectedStringgetSelfInitializationConfig(){returnfindConfig(getStandardConfig;Locations}s())getStandardConfigLocations是一个抽象的方法,不同的日志系统都有自己的实现。logback提供的文件名如下。可以看到没有logback-spring文件。@OverrideprotectedString[]getStandardConfigLocations(){returnnewString[]{“logback-test.groovy”,“logback-test.xml”,“logback.groovy”,“logback.xml”};}而findConfig方法是在classpath下逐一搜索这些文件名,返回找到的第一个配置文件。当classpath下没有找到默认的配置文件时,寻找spring自定义的配置文件。spring配置文件本质上是在默认的配置文件名上加上-spring后缀,在classpath中获取。protectedString[]getSpringConfigLocations(){String[]位置=getStandardConfigLocations();for(inti=0;i