Log4j详细介绍(三)Log4j的优化

  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+" 次 运算");// 连接字符串输出
原文地址:https://www.cnblogs.com/ArtsCrafts/p/log4j3.html