log4j入门、详解 - 图文 

loading 分享 2026-8-1 下载文档

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


log4j入门、详解 - 图文 .doc 将本文的Word文档下载到电脑
搜索更多关于: log4j入门、详解 - 图文  的文档
相关推荐
相关阅读