Spring Boot Logging Level設(shè)置為off時(shí)的Bug
Logging Level設(shè)置為off時(shí)的Bug
阿里云的KAFA有一個(gè)特性就是會(huì)主動(dòng)關(guān)閉空閑的鏈接,這樣導(dǎo)致的問題就是客戶端程序會(huì)不停的報(bào)如下的異常信息:
java.io.IOException: 遠(yuǎn)程主機(jī)強(qiáng)迫關(guān)閉了一個(gè)現(xiàn)有的連接。
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]
而這個(gè)異常信息,其實(shí)意義不大,而且會(huì)一直出,所以就有了需求想要關(guān)閉kafka這個(gè)包的日志。
臨時(shí)解決方法
Spring Boot Logging將LogLevel抽象為6個(gè)級別,還有一個(gè)OFF,是配置關(guān)閉日志:
/** * Logging levels supported by a {@link LoggingSystem}. * * @author Phillip Webb */ public enum LogLevel { TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF }
但是將某個(gè)包的日志級別設(shè)置為OFF時(shí),控制臺會(huì)報(bào)如下的信息:
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 + "'"); } }
此時(shí) RuntimeException ex的異常信息如下
java.lang.IllegalArgumentException: No enum constant org.springframework.boot.logging.LogLevel.FALSE
查看level = environment.resolvePlaceholders(level)的值,確實(shí)是字符串false而不是off,所以LogLevel.valueOf(level.toUpperCase())在解析的時(shí)候就報(bào)錯(cuò)了。
屬性的值在ConfigFileApplicationListener加載完各個(gè)PropertySource之后,這個(gè)值就確定了。
臨時(shí)的解決辦法是將日志級別調(diào)整到fatal,不管是我們自己的代碼還是各類開源框架log信息時(shí)的最高的級別一般都是error,調(diào)整到fatal可以解決大部分問題。
Springboot項(xiàng)目 logging level配置
開始報(bào)錯(cuò):
Failed to bind properties under ‘logging.level' to java.util.Map<java.lang.String, org.springframewo
原項(xiàng)目代碼:
logging
:level
:info
正確代碼:
logging
:root
:level
:info
之后運(yùn)行正確~
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于javaWeb中405錯(cuò)誤的解決方法
下面小編就為大家?guī)硪黄P(guān)于javaWeb中405錯(cuò)誤的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05Springboot配置文件內(nèi)容加密代碼實(shí)例
這篇文章主要介紹了Springboot配置文件內(nèi)容加密代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11詳解Java中布隆過濾器(Bloom Filter)原理及其使用場景
布隆過濾器是1970年由布隆提出的,它實(shí)際上是一個(gè)很長的二進(jìn)制向量和一系列隨機(jī)映射函數(shù),它的作用是檢索一個(gè)元素是否存在我們的集合之中,本文給大家詳細(xì)的講解一下布隆過濾器,感興趣的同學(xué)可以參考閱讀2023-05-05使用MQ消息隊(duì)列的優(yōu)缺點(diǎn)詳解
這篇文章主要介紹了使用MQ消息隊(duì)列的優(yōu)缺點(diǎn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07詳解Java volatile 內(nèi)存屏障底層原理語義
為了保證內(nèi)存可見性,java 編譯器在生成指令序列的適當(dāng)位置會(huì)插入內(nèi)存屏障指令來禁止特定類型的處理器重排序。為了實(shí)現(xiàn) volatile 內(nèi)存語義,JMM 會(huì)分別限制這兩種類型的重排序類型2021-09-09Java創(chuàng)建樹形結(jié)構(gòu)算法實(shí)例代碼
本篇文章主要介紹了Java創(chuàng)建樹形結(jié)構(gòu)算法實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01