这个问题有点刁钻,很少有人问,但是这确确实实是个比较大的问题,尤其是很多大厂的大促的时候,经常会出现因为日志打印而导致接口 RT 变长的问题。那么有哪些方案可以解决呢?
1、最容易能想到的,就是控制日志的输出量,把一些没用的日志干脆就不要输出了,你输出的日志应该是能帮助你做监控、告警,以及问题排查的,如果没有用,就干脆不要输出了。
2、日志级别,这个也挺重要的,线上一般来说只需要输出 WARN 和 ERROR 就够了,至于INFO 很多系统都不太关心,所以这个视情况而定,可以考虑通过提高日志级别来减少日志输出的量,但是这个需要注意,别为了减少日志量导致你日志缺失,影响问题排查,那就得不偿失了。
3、日志打印前,做级别检测,这个不展开说,下面这篇写的很清楚了。
✅为什么logger.warn()之前要使用logger.isWarnEnabled()?
4、异步日志。建议大家都采用异步日志而不是同步日志,log4j、logback 等框架都是支持的。这样可以减少应用打印日志时候的阻塞。同时根据日志是否可都是可以配置neverBlock,neverBlock=true 时,会在队列满了之后丢弃日志,避免阻塞。根据你的实际情况选择使用。
5、日志文件的滚动,这个也需要注意,通过配置rollingPolicy,来限制一个日志文件的大小,并且让他在"满了"之后可以创建出新的日志文件的。
6、日志文件拆分,可以不要把日志都打在同一个日志文件中,做一些拆分,业务日志、异常日志等可以配置不同的 logger,让他们打印到不同的文件中,以防止单个文件操作的互相阻塞。
7、日志的降级,在我司,很多业务,在大促的时候是可以开启日志降级的。有两种方案 ,一种是直接配置日志打印的比例,比如配置只输出10%的日志用于采样和监控。还有一种是是直接推送ERROR\WARN 等级别来运行时控制日志输出的级别,当然可以细粒度到不同的 logger 上,进行日志的降级。
以上,就是我能想到的一些关于日志优化的方案了。