背景:最近在做log4j升级到Log4j2的项目,在测试升级之后的性能时,被惊了一下,性能没有提升,反而下降了,赶紧研究了一下log4j2的相关配置,以下是研究结果。
1.
使用FileAppender的时候,配置若是ImmediateFlush=true,一旦有新日志写入,立马将日志写入到磁盘的文件中。当日志很多,这种频繁操作文件显然性能很低下。
2.不要使用Location相关属性,例如
C or $class, %F or %file, %l or %location, %L or %line, %M or %method
,大概降低
30到100倍。includeLocation要设置为false(默认为false,可以直接不设置)。
3.推荐使用RollingRandomAccessFile,大概可以视为RollingFileAppender的进化版,没有bufferedIO这个属性,对于RollingRandomAccessFile,缓存是固定开启的。fileName是实时写入的(未归档)文件名,filePattern则是归档文件的命名模式,因为开启了异步日志所以这里immediateFlush设置为false(不过好像不管它也无所谓),bufferSize缓冲区大小暂时默认(默认为8K),最后,TriggeringPolicy和RolloverStrategy是必须有的,没有显示定义就会采用默认的。
4.在大并发的条件下,需使用纯异步记日志或混合异步记日志,推荐增大
log4j2.asyncLoggerRingBufferSize
的值(默认为256*1024),设置时可以加在jvm启动的脚本里。下面例子里是两倍默认值。这个值是被log4j2依赖的disruptor.jar中的参数,log4j2的高性能异步记日志全是借助于它。
-Dlog4j2.asyncLoggerRingBufferSize = 524288
以上是一天的研究成果,还得接着扣,毕竟性能第一(狗头保命)。