log4j入门、详解
6. 注意事项
6.1 为什么使用logger之前要判断日志输入级别?
经常看到代码中有这样的写法: if(logger.isDebugEnabled()){ logger.debug(AssessmentParamsUtils.getParams().toString()); } 有人就有疑问了,这个和下面直接debug的写法有什么区别? logger.debug(AssessmentParamsUtils.getParams().toString()); 我们来看一下源码:
debug方法的源码(log4j) public void debug(Object message) { if (repository.isDisabled(Level.DEBUG_INT)) return; if (Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) { forcedLog(FQCN, Level.DEBUG, message, null); } } isDebugEnabled方法的源码(log4j) public boolean isDebugEnabled() { if (repository.isDisabled(Level.DEBUG_INT)) return false; return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel()); } 其实判断是一样的,都判断了debug级别是否开启,这样看来,判断似乎没有区别,那为什么还要加这个判断呢?
答:为了性能。
其实原因不在debug上,而在日志输入的东西上,如果只输入简单的字符串,或者小对象,异常等等,那么这两个没有区别,建议就不用判断了,区别不大。
但是,一旦输出前执行了比较费时的方法,那么就很影响性能了,如上面这段中的 AssessmentParamsUtils.getParams().toString() 如果这句话执行需要1分钟,那么加判断的就一下子过去了,不执行这句话,而没有加判断的需要先执行这句话,1分钟后执行完毕,才去执行debug,一判断不输出,跳过,虽然结果一样,但是多执行了1分钟,严重影响了性能。现实中不会到1分钟的,这里的1分钟只是示例,但是高并发时,影响还是挺大的。 同理其他方法: logger.isDebugEnabled(); logger.isErrorEnabled(); logger.isFatalEnabled(); logger.isInfoEnabled(); logger.isTraceEnabled(); logger.isWarnEnabled(); 为了更健壮的代码,像这样的小细节以后也要多注意了。
16