Bug when Spring Boot Logging Level is set to off
- 2021-11-14 05:42:45
- OfStack
Bug when Logging Level is set to off
Alibaba Cloud's KAFA has a feature that it will actively close idle links, which leads to the problem that the client program will constantly report the following abnormal information:
java. io. IOException: The remote host forced an existing connection to close.
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]
And this exception information, in fact, is of little significance, and will be 1 straight out, so there is a need to close the log of kafka package.
Temporary solution
Spring Boot Logging abstracts LogLevel into six levels, and there is one OFF that configures the shutdown log:
/**
* Logging levels supported by a {@link LoggingSystem}.
*
* @author Phillip Webb
*/
public enum LogLevel {
TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
}
But when you set the logging level of a package to OFF, the console reports the following message:
2017-08-24 13:52:12.882 ERROR 12672 --- [ main] o.s.cloud.logging.LoggingRebinder : Cannot set level: false for 'org.apache.kafka'
Navigate to the LoggingRebinder # setLogLevel method:
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 + "'");
}
}
The exception information for RuntimeException and ex is as follows
java.lang.IllegalArgumentException: No enum constant org.springframework.boot.logging.LogLevel.FALSE
Looking at the value of level = environment. resolvePlaceholders (level), it is indeed the string false instead of off, so LogLevel. valueOf (level. toUpperCase ()) reports an error when parsing.
The value of the property is determined after ConfigFileApplicationListener has loaded each PropertySource.
The temporary solution is to adjust the log level to fatal. Whether it is our own code or the highest level of log information of various open source frameworks, it is generally error. Adjusting to fatal can solve most problems.
Springboot Project logging level Configuration
Start reporting errors:
Failed to bind properties under 'logging. level' to java. util. Map < java.lang.String, org.springframewo
Original project code:
logging
:
level
:
info
Correct code:
logging
:
root
:
level
:
info
After that, it runs correctly ~