logger.isDebugEnabled()作用

项目中经常会用到:
if (logger.isDebugEnabled()) {
    logger.debug( "message:" + user.getMessage() );
}
我们会想当然得认为这段代码作用是为了控制日志文件的输出,但是通过查看源码我们会发现,在debug()方法中做了与isDebugEnabled()方法一样的判断,因此我们在需要输出日志的地方直接调用debug方法也可以达到控制输出的目的。
以下是isDebugEnabled()以及debug()方法的源码:

public boolean isDebugEnabled() {

  if(repository.isDisabled( Level.DEBUG_INT))

    return false;

  return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());

}

public void debug(Object message) {

  if(repository.isDisabled(Level.DEBUG_INT))

    return;

  if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {

    forcedLog(FQCN, Level.DEBUG, message, null);

  }

}

那么我们为什么还要多此一举,加上这样一个判断语句呢?

官方的说法是:出于效率考虑,看具体情况而定。

首先我们看以下代码:

log.debug( "message:" + user.getMessage() );
假如我们的日志级别为info,那么这句话不会被输出,但是这样写,这个方法还是会调用,因此getMessage()方法还是会执行。如果getMessage()这个方法过于复杂,需要很长时间来执行。而参数构造完之后,我们进入debug()方法进行判断:
    if(repository.isDisabled(Level.DEBUG_INT))
        return;
在这里就返回了。这样会导致我们什么都没有做但却耗费了时间,如果并发量大的时候,对性能的影响就比较明显了。
    这个时候,出于性能的考虑,我们就应当添加isDebugEnabled()判断
    if (logger.isDebugEnabled()) {

logger.debug( "message:" + user.getMessage() );

}
但是如果是这样简单的输出:
    logger.debug(“error”);
添加判断就没有必要了。

时间: 2024-08-01 22:37:46

logger.isDebugEnabled()作用的相关文章

spring this.logger.isDebugEnabled()

这种写法在网银的时候也见到过,不过那个时候没有太深入去想,回想起来为什么会在代码里边这么写,确实是一个需要了解的问题 首先这个问题涉及到了 log 日志的级别, Logger共有6个log级别,按优先级由低到高排序分别是: TRACE < DEBUG < INFO < WARN < ERROR < FATAL 他们分别对应Logger的trace, debug, info, warn, error和fatal方法进行输出,但是我们通常只使用debug.info和error这三

SpringMVC中 -- @RequestMapping的作用及用法

一.@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置 <servlet> <servlet-name>servletName</servlet-name> <servlet-class>ServletClass</servlet-class> </servlet> <ser

org.apache.log4j.Logger详解

1. 概述 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作:跟踪代码运行时轨迹,作为日后审计的依据:担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息. 最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类 来封装此类操作,而不是让一系列的打印语句充斥了代码的主体. http://logging.apache.org/log4j

mybatis源码分析(3)-----SqlSessionHolder作用

1. sqlSessionHolder 是位于mybatis-spring 包下面,他的作用是对于sqlSession和事务的控制 2 .在前面讲解到,sqlSessionTemplate 操作数据库实际操作是对于代理对象 目标方法的执行. 代理对象是如何获取defaultSqlSession ,在代理方法中通过SqlSessionUtils 的方法获取SqlSession public static SqlSession getSqlSession(SqlSessionFactory sess

org.apache.log4j.Logger 详解

org.apache.log4j.Logger 详解 1. 概述 1.1. 背景    在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作:跟踪代码运行时轨迹,作为日后审计的依据:担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息.   最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类 来封装此类操作,而不是让一系列的打印语句充斥了代码的主体.

springMVC DispatcherServlet作用

from:  http://jinnianshilongnian.iteye.com/blog/1602617 3.1.DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处. 具体请参考第二章的图2-1. DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下: 1.文件上

spring aop 原理

http://blog.csdn.net/moreevan/article/details/11977115 Spring AOP 实现原理 2013-09-24 15:23 79554人阅读 评论(11) 收藏 举报  分类: spring(2)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)

Java权威编码规范

一.编程规约 (一) 命名规约 1. [强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _nam / __name / $Object / name_  / name$ / Object$2. [强制] 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式. 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义.注意,即使纯拼音命名方式也要避免采用. 反例: DaZhePromotion [打折] / getPingfenByName

对spring web启动时IOC源码研究(二)

发现这样debug到哪说到哪好像有点回不来了~让我重新理下思路,主要步骤先上图,有什么不同意见欢迎批评教育~ (一)spring IOC的主要步骤都在refresh()这个方法中,我给出了自己的理解注释 @Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // 解析前准备工作,主要为打log,设置act