问题原因
日志打印I/O 操作开销(如 Log4j 的 FileAppender)会阻塞业务线程,直到日志写入完成,导致接口响应变慢
问题描述
- 在线上环境,客户反馈导入一个不到1MB的excel文件,耗时将近5分钟。
问题排查
-
发现日志文件有打印超多以下日志:
WARN DefaultAnalysisEventProcessor:41 - Empty row!
-
和客户拿到文件分析后认定是客户导入的文件中存在大量的空行。导致的上述日志疯狂打印,每一行是空都会打印一条,导致接口耗时变慢。
-
源码寻找,如图:
-
发现这行日志打印需满足日志等级是debug级别的才会打印。嗨,恰巧,由于项目年代久远我司线上环境日志级别是debug,导致了上述问题的发生。
问题解决
修改日志级别为info 避免日志打印。
Log4j日志配置修改方法
log4j.logger.com.alibaba.excel.read.processor.DefaultAnalysisEventProcessor=INFO
spring boot项目,日志级别修改方式
logging:
level:
com.alibaba.excel.read.processor.DefaultAnalysisEventProcessor: INFO