如何通过YAML变量与配置类屏蔽MongoDB连接异常日志?
解决MongoDB监控线程连接localhost:27017的异常日志问题
问题场景
日志中频繁出现MongoDB监控线程连接localhost:27017失败的异常,希望通过YAML配置变量控制:当不存在指定DataType变量时,自动排除MongoDB相关配置,避免生成该异常日志。目前已尝试创建MongoDBConfig配置类,但未达到预期效果。
异常日志详情
2023-01-13 14:03:40.620 INFO 11124 --- [localhost:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server localhost:27017 com.mongodb.MongoSocketOpenException: Exception opening socket at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:180) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:193) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:157) ~[mongodb-driver-core-4.6.1.jar:na] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na] Caused by: java.net.ConnectException: Connection refused: no further information at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na] at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na] at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) ~[na:na] at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) ~[na:na] at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[na:na] at java.base/java.net.Socket.connect(Socket.java:633) ~[na:na] at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:107) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongodb-driver-core-4.6.1.jar:na] ... 4 common frames omitted
现有配置类代码
@Configuration @AutoConfigureBefore(value = MongoAutoConfiguration.class) @ConditionalOnProperty(prefix = "${mock-server.data.persist-type}", value = "DataType", matchIfMissing = true) public class MongoDBConfig {
解决方案
方案一:修正配置类条件,按需加载MongoDB配置
现有@ConditionalOnProperty存在两处逻辑错误:
prefix属性不能用${}包裹,它仅代表配置项的前缀部分matchIfMissing = true与需求相反,应仅当配置值匹配时才加载配置
修正后的配置类代码:
@Configuration @AutoConfigureBefore(MongoAutoConfiguration.class) // 仅当mock-server.data.persist-type等于DataType时,才加载该配置类 @ConditionalOnProperty(prefix = "mock-server.data", name = "persist-type", havingValue = "DataType", matchIfMissing = false) public class MongoDBConfig { // 在此添加MongoDB相关Bean配置(如MongoClient、MongoTemplate等) }
当YAML中未配置mock-server.data.persist-type或其值不等于DataType时,Spring不会加载MongoDB相关配置,自然不会触发连接尝试,也就不会生成该异常日志。
方案二:直接屏蔽日志(不停止连接尝试)
如果不需要完全禁用MongoDB配置,只是想屏蔽该异常日志,可以在application.yml中调整日志级别:
logging: level: org.mongodb.driver.cluster: ERROR
将org.mongodb.driver.cluster的日志级别设为ERROR,即可过滤掉INFO级别的连接异常日志,但MongoDB监控线程仍会尝试连接。
内容的提问来源于stack exchange,提问作者Benicius Claro
相关产品推荐
相关产品推荐

