Spring Boot Logging Level设置为off时的Bug

 更新时间:2021年09月16日 09:57:01   作者:陈振阳  
这篇文章主要介绍了Spring Boot Logging Level设置为off时的Bug,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Logging Level设置为off时的Bug

阿里云的KAFA有一个特性就是会主动关闭空闲的链接,这样导致的问题就是客户端程序会不停的报如下的异常信息:

java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.write0(Native Method) ~[na:1.8.0_112]
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51) ~[na:1.8.0_112]
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[na:1.8.0_112]
at sun.nio.ch.IOUtil.write(IOUtil.java:65) ~[na:1.8.0_112]
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) ~[na:1.8.0_112]
at org.apache.kafka.common.network.SslTransportLayer.flush(SslTransportLayer.java:195) ~[kafka-clients-0.10.2.0.jar:na]
at org.apache.kafka.common.network.SslTransportLayer.close(SslTransportLayer.java:163) ~[kafka-clients-0.10.2.0.jar:na]
at org.apache.kafka.common.utils.Utils.closeAll(Utils.java:731) [kafka-clients-0.10.2.0.jar:na]
at org.apache.kafka.common.network.KafkaChannel.close(KafkaChannel.java:54) [kafka-clients-0.10.2.0.jar:na]
at org.apache.kafka.common.network.Selector.doClose(Selector.java:540) [kafka-clients-0.10.2.0.jar:na]
at org.apache.kafka.common.network.Selector.close(Selector.java:531) [kafka-clients-0.10.2.0.jar:na]
at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:378) [kafka-clients-0.10.2.0.jar:na]
at org.apache.kafka.common.network.Selector.poll(Selector.java:303) [kafka-clients-0.10.2.0.jar:na]
at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:349) [kafka-clients-0.10.2.0.jar:na]
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:226) [kafka-clients-0.10.2.0.jar:na]
at org.apache.kafka.clients.consumer.KafkaConsumer.pollOnce(KafkaConsumer.java:1048) [kafka-clients-0.10.2.0.jar:na]
at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:995) [kafka-clients-0.10.2.0.jar:na]
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:558) [spring-kafka-1.1.6.RELEASE.jar:na]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_112]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_112]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_112]

而这个异常信息,其实意义不大,而且会一直出,所以就有了需求想要关闭kafka这个包的日志。

临时解决方法

Spring Boot Logging将LogLevel抽象为6个级别,还有一个OFF,是配置关闭日志:

/**
 * Logging levels supported by a {@link LoggingSystem}.
 *
 * @author Phillip Webb
 */
public enum LogLevel {
    TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
}

但是将某个包的日志级别设置为OFF时,控制台会报如下的信息:

2017-08-24 13:52:12.882 ERROR 12672 --- [ main] o.s.cloud.logging.LoggingRebinder : Cannot set level: false for 'org.apache.kafka'

定位到LoggingRebinder#setLogLevel方法:

private void setLogLevel(LoggingSystem system, Environment environment, String name,
            String level) {
        try {
            if (name.equalsIgnoreCase("root")) {
                name = null;
            }
            level = environment.resolvePlaceholders(level);
            system.setLogLevel(name, LogLevel.valueOf(level.toUpperCase()));
        }
        catch (RuntimeException ex) {
            this.logger.error("Cannot set level: " + level + " for '" + name + "'");
        }
    }

此时 RuntimeException ex的异常信息如下

java.lang.IllegalArgumentException: No enum constant org.springframework.boot.logging.LogLevel.FALSE

查看level = environment.resolvePlaceholders(level)的值,确实是字符串false而不是off,所以LogLevel.valueOf(level.toUpperCase())在解析的时候就报错了。

属性的值在ConfigFileApplicationListener加载完各个PropertySource之后,这个值就确定了。

临时的解决办法是将日志级别调整到fatal,不管是我们自己的代码还是各类开源框架log信息时的最高的级别一般都是error,调整到fatal可以解决大部分问题。

Springboot项目 logging level配置

开始报错:

Failed to bind properties under ‘logging.level' to java.util.Map<java.lang.String, org.springframewo

原项目代码:

  • logging:
  • level: info

正确代码:

  • logging:
  • root:
  • level: info

之后运行正确~

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

相关文章

  • Spring-boot 2.3.x源码基于Gradle编译过程详解

    Spring-boot 2.3.x源码基于Gradle编译过程详解

    这篇文章主要介绍了Spring-boot 2.3.x源码基于Gradle编译过程详解,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • JAVA中split函数的常见用法实例

    JAVA中split函数的常见用法实例

    Java中我们可以利用split把字符串按照指定的分割符进行分割,然后返回字符串数组,下面这篇文章主要给大家介绍了关于JAVA中split函数的常见用法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • SpringMVC和Spring的配置文件扫描包详解

    SpringMVC和Spring的配置文件扫描包详解

    这篇文章主要介绍了SpringMVC和Spring的配置文件扫描包,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-05-05
  • Java线程并发中常见的锁机制详细介绍

    Java线程并发中常见的锁机制详细介绍

    越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题。接下来通过本文给大家介绍Java线程并发中常见的锁机制,感兴趣的朋友一起看看吧
    2016-05-05
  • CGLIB代理的使用与原理解析

    CGLIB代理的使用与原理解析

    这篇文章主要介绍了CGLIB代理的使用与原理解析,静态代理和JDK 代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理,这就是Cglib代理,需要的朋友可以参考下
    2023-09-09
  • 简单了解Spring中BeanFactory与FactoryBean的区别

    简单了解Spring中BeanFactory与FactoryBean的区别

    这篇文章主要介绍了简单了解Spring中BeanFactory与FactoryBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • spring结合redis如何实现数据的缓存

    spring结合redis如何实现数据的缓存

    这篇文章主要介绍了spring结合redis如何实现数据的缓存,实现的目的目的不是加快查询的速度,而是减少数据库的负担,需要的朋友可以参考下
    2015-12-12
  • springboot配置aop切面日志打印过程解析

    springboot配置aop切面日志打印过程解析

    这篇文章主要介绍了springboot配置aop切面日志打印过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Intellij idea 代码提示忽略字母大小写和常用快捷键及设置步骤

    Intellij idea 代码提示忽略字母大小写和常用快捷键及设置步骤

    这篇文章主要介绍了Intellij idea 代码提示忽略字母大小写和常用快捷键及设置步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • SpringCloud使用Zookeeper作为配置中心的示例

    SpringCloud使用Zookeeper作为配置中心的示例

    这篇文章主要介绍了SpringCloud使用Zookeeper作为配置中心的示例,帮助大家更好的理解和学习使用SpringCloud,感兴趣的朋友可以了解下
    2021-04-04

最新评论