Log4j内部使用了大量的优化,缓存工作,使输出时对服务器的压力,消耗的时间,资源等都达到最小。例如:
1 log.debug("debug信息"); 2 log.warn("warn信息");
这两句日志可能被记录到日志文件中,但是写的过程不同于常规的打开文件,写文件,关闭文件等流程,频繁地打开文件,关闭文件需要消耗大量资源。Log4j只有初始化时候打开文件,并保持对文件的写控制,知道系统结束的时候才关闭文件。这样就使I/O次数达到最小,提高了效率。
而当输出级别为ERROR时,log.debug(),log.waring()方法会因为输出级别小雨ERROR而直接返回,因此不会消耗太多的资源。debug()内部实现如下:
1 public void debug(Object message){ 2 if (this.repository.isDisabled(10000)) 3 return; 4 if (Level.DEBUG.isGreaterOrEqual(getEffectiveLevel())) 5 forcedLog(FQCN, Level.DEBUG, message, null); 6 } 7 }
虽然设置为ERROR时debug()会直接返回,但是下面的代码仍然会消耗额外的时间,原因是在执行debug()前,需要先将字符串进行连接。
1 log.debug("开始计算 "+i+" * "+j+" 次 运算");
如果想要避免这种消耗,最好使用isXxxEnable()或者isEnableFor()判断一下,例如:
1 if(log.isDebugEnabled())//如果debug级别可用 2 log.debug("开始计算 "+i+" * "+j+" 次 运算");//连接字符串,输出 3 if(log.isEnabledFor(Priority.WARN))//或者,如果warn可用 4 log.debug("开始计算 "+i+" * "+j+" 次 运算");// 连接字符串输出