Spring Boot 2.6.5中exception-conversion-word致日志行合并问题
问题:Spring Boot 2.6.5 异常日志单行化后合并后续日志行
使用Spring Boot 2.6.5,通过application.properties配置logging.level.exception-conversion-word结合logback.xml,将异常日志的换行替换为特殊字符实现单行化,但出现异常日志的下一条日志行被合并到异常行末尾的问题。
当前配置
logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <include resource="org/springframework/boot/logging/logback/console-appender.xml"/> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration>
application.properties
logging.level.exception-conversion-word: "%replace(%wEx){'\n','\u2028'}%nopex"
异常现象
异常日志换行被替换为单行符合预期,但后续日志直接附加在异常行末尾,示例如下:
2023-08-15 14:09:12.337 INFO 31216 --- [azure.com:10255] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server mongodb-abcde-westus.mongo.cosmos.azure.com:10255 com.mongodb.MongoSocketException: mongodb-abcde-westus.mongo.cosmos.azure.com: nodename nor servname provided, or not known at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211) at com.mongodb.connection.netty.NettyStream.openAsync(NettyStream.java:163) at com.mongodb.connection.netty.NettyStream.open(NettyStream.java:154) at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:180) at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:188) at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:152) at java.lang.Thread.run(Thread.java:750) Caused by: java.net.UnknownHostException: mongodb-abcde-westus.mongo.cosmos.azure.com: nodename nor servname provided, or not known at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:867) at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302) at java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:815) at java.net.InetAddress.getAllByName0(InetAddress.java:1291) at java.net.InetAddress.getAllByName(InetAddress.java:1144) at java.net.InetAddress.getAllByName(InetAddress.java:1065) at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203) ... 6 common frames omitted 2023-08-15 14:11:14.067 INFO 31216 --- [azure.com:10255] org.mongodb.driver.connection : Opened connection [connectionId{localValue:139, serverValue:416056366}] to mongodb-abcde-westus.mongo.cosmos.azure.com:10255
解决方案
修改application.properties中的配置,调整正则表达式仅替换异常栈内部的换行符,保留异常内容结尾的换行,确保后续日志能正常换行:
logging.level.exception-conversion-word: "%replace(%wEx){'\n(?!$)','\u2028'}%nopex"
原理说明
原配置替换了异常输出中的所有换行符,包括异常内容结尾的换行,导致日志系统无法在异常日志与下一条日志之间插入分隔换行,进而出现合并问题。调整后的正则\n(?!$)仅匹配非结尾位置的换行,替换为\u2028,同时保留异常末尾的换行,保证后续日志能单独成行显示。
内容的提问来源于stack exchange,提问作者Venu
相关产品推荐
相关产品推荐

