logback日志级别设置无效问题及解决

 更新时间:2025年11月13日 09:05:57   作者:shuxiaohua  
文章总结:文章介绍了在Spring Boot项目中配置日志级别时,优先级问题,通过查阅资料发现,配置文件中的logging.level.xx也能配置日志级别,且优先级比logback.xml高,文章还提供了源码分析,说明了Spring Boot如何处理日志级别配置

背景

项目同事在定位定时任务没执行时发现,定时任务中的日志没有打印,改成WARN后能够正常打印(代码中log.info()改为log.warn())。

检查logback.xml中发现对应的日志级别为INFO级别,当时不清楚还有哪里能够配置日志级别,遂百度查阅资料。

原来配置文件中的logging.level.xx也能配置日志级别,且优先级比logback.xml高。以下是源码分析。

源码分析

首先spring的配置项

都会在spring-configuration-metadata.json中进行说明,因此在IDE中搜索该关键字,查看配置项的说明。

    {
      "name": "logging.level",
      "type": "java.util.Map<java.lang.String,java.lang.String>",
      "description": "Log levels severity mapping. For instance, `logging.level.org.springframework=DEBUG`.",
      "sourceType": "org.springframework.boot.context.logging.LoggingApplicationListener"
    }

从内容中可以看到

该配置项由org.springframework.boot.context.logging.LoggingApplicationListener处理。

	protected void setLogLevels(LoggingSystem system, ConfigurableEnvironment environment) {
		BiConsumer<String, LogLevel> customizer = getLogLevelConfigurer(system);
		Binder binder = Binder.get(environment);
		# 从配置中获取日志级别的配置项
		Map<String, LogLevel> levels = binder.bind(LOGGING_LEVEL, STRING_LOGLEVEL_MAP).orElseGet(Collections::emptyMap);
		levels.forEach((name, level) -> configureLogLevel(name, level, customizer));
	}

	private void configureLogLevel(String name, LogLevel level, BiConsumer<String, LogLevel> configurer) {
		if (this.loggerGroups != null) {
			LoggerGroup group = this.loggerGroups.get(name);
			if (group != null && group.hasMembers()) {
				group.configureLogLevel(level, configurer);
				return;
			}
		}
		# 代码会走到这里
		configurer.accept(name, level);
	}

配置logging.level.org=ERROR调试代码如下

可以看到通过logfactory获取logger后

使用logging.level配置项重新覆盖了其日志级别,所以配置项中的日志级别高于logback.xml中的日志级别。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实现银行家算法(Swing界面)

    java实现银行家算法(Swing界面)

    这篇文章主要为大家详细介绍了银行家算法的java代码实现,Swing写的界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 解决Failed to get nested archive for entry BOOT-INF/lib/xxx.jar问题

    解决Failed to get nested archive for&

    解决BOOT-INF/lib/xxx.jar替换异常需确保路径正确:解压原jar包,替换BOOT-INF/lib目录下的目标jar,再重新打包,手动创建目录结构同样有效,但需严格匹配原路径,避免错误
    2025-08-08
  • 浅析Java中的虚拟线程

    浅析Java中的虚拟线程

    在本篇文章中,小编将带大家深入了解Java虚拟线程的原理、如何使用、使用的注意事项以及其他相似技术的差别,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • spring为类的静态属性实现注入实例方法

    spring为类的静态属性实现注入实例方法

    在本篇文章里小编给大家整理的是关于spring为类的静态属性实现注入实例方法,有需要的朋友们可以参考下。
    2019-10-10
  • Springboot+Flowable 快速实现工作流的开发流程

    Springboot+Flowable 快速实现工作流的开发流程

    这篇文章主要介绍了Springboot+Flowable 快速实现工作流的开发流程,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • tomcat在Linux环境下的安装与配置详细教程

    tomcat在Linux环境下的安装与配置详细教程

    这篇文章主要介绍了tomcat在Linux环境下安装与配置的相关资料,涵盖Java环境准备、下载解压、启动服务、部署项目及管理界面设置,适合开发测试环境搭建,需要的朋友可以参考下
    2025-05-05
  • JAVA编程实现TCP网络通讯的方法示例

    JAVA编程实现TCP网络通讯的方法示例

    这篇文章主要介绍了JAVA编程实现TCP网络通讯的方法,简单说明了TCP通讯的原理并结合具体实例形式分析了java实现TCP通讯的步骤与相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • 详解SpringBoot 添加对JSP的支持(附常见坑点)

    详解SpringBoot 添加对JSP的支持(附常见坑点)

    这篇文章主要介绍了详解SpringBoot 添加对JSP的支持(附常见坑点),非常具有实用价值,需要的朋友可以参考下
    2017-10-10
  • Java截取字符串的几种常用方法

    Java截取字符串的几种常用方法

    这篇文章主要给大家介绍了关于Java截取字符串的几种常用方法,在Java编程语言中,String类提供了用于操作字符串的丰富方法,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 利用Java判断一个字符串是否包含某个字符

    利用Java判断一个字符串是否包含某个字符

    在Java编程中,字符串操作是日常开发的常见任务,涉及判断、查找、替换等多种操作,文章介绍了如何在Java中判断字符串是否包含某字符,提供了使用contains方法和字符数组遍历两种基础方法,需要的朋友可以参考下
    2024-11-11

最新评论