`
kang
  • 浏览: 472578 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

if (log.isDebugEnabled()) {}使用场景初析

阅读更多

说明:本文(”问题和回答1和回答2“部分)转载自:http://huangxx.iteye.com/blog/190693

”分析和我的回答“部分是我自己的分析,故将本文改成原创(更确切的类型应该是转载+原创)。

 

 

问题:

在使用log4j,common-log这样的log框架时,发现很多代码中这样写
if   (log.isDebugEnabled ())   {
          log.debug( "xxxx ");
}

我很奇怪,为什么要与log.isDebugEnabled ()?既然log.debug()在没有指定输出级别为DEBUG时不会有输出,为什么还要在前面加一个isDebugEnabled ()的判断?

 

回答1:

   1. 为了效率,如果上述那个代码那么简单是没有必要的   
   2.   
   3. 但是如果这样   
   4. if   (log.isDebugEnabled())   {   
   5.           log.debug(buildFullString());   
   6. }   
   7.   
   8. 如果这个buildFullString效率不太高,那么如果直接写log.debug(buildFullString());的话   
   9.   
  10. 虽然它不会打印语句,但是buildFullString还是被执行了,这样就白费了功夫   
  11.   
  12. 所以加上isDebugEnabled就可以避免执行buildFullString了   
  13.   
  14. 这个方法一般用在认为buildFullString这个函数效率不太高的情况下  

 

回答2:

   1. 加不加if,效果相同,但是效率不同   
   2.   
   3. 在你的例子里,debug的参数就是一个string,所以没有太本质的差别   
   4.   
   5. 但是假如log.debug( "map= "   +   map) 的话,在调用debug之前,必然需要调用map.toString(),而这个操作可能导致更多的大量字符串操作,最后,才能得到这个辛辛苦苦拼接出来的结果,作为参数传入debug(),结果,这个参数却不需要(一般在log方法入口就判断输出level)。  

 

 

 

20090409说明:我下载了log4j的源代码,apache-log4j-1.2.15.zip。

 

org.apache.log4j包中的Category类,debug方法定义如下:

 

  public void debug(Object message) {
    if(repository.isDisabled(Level.DEBUG_INT))
      return;
    if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
      forcedLog(FQCN, Level.DEBUG, message, null);
    }
  }

分析:可以看出,在debug方法内部,也先进行了log级别的判断。

显然,在使用这个debug方法之前,首先要将参数message构筑好。这也是先使用isDebugEnabled 方法进行判断的目的。

 

(20090414追加)我的回答:在前面加不加这句if判断,结果是一样的,但是效率可能有所差别:

当输出级别是debug,即需要进行日志信息输出时,加不加这句if判断,在效率上几乎没有差别;

当输出级别高于debug,即不需要进行日志信息输出时:

①假如debug方法中的参数比较简单时(比如直接就是写好的字符串),加不加这句if判断,在效率上也几乎没有什么差别;

②假如debug方法中的参数比较复杂时(比如还要使用别的函数进行计算、或者还要进行字符串的拼接等等),在前面就加上这句if判断,会让效率提高(否则,开始大动干戈做了很多事情(比如字符串的拼接),后来才发现不需要进行输出日志信息)。

-》上面的这段分情况讨论的描述,可以作为回答这个问题的“标准”答案。(20090507追加)

 

 

分享到:
评论
1 楼 jyjava 2011-12-24  
呵呵,不错,跟把结果放到哈市map中一样,在查询数据库之前,先进行判断是否存在

相关推荐

    Log.isLoggable之一正确的使用姿势

    本文将详细介绍`Log.isLoggable`的正确使用姿势以及它在实际开发中的应用场景。 首先,我们来看`Log.isLoggable`的基本用法。它的原型是: ```java public static boolean isLoggable(String tag, int level) ``` ...

    Android开发笔记之:Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)

    本文将详细解析Android中的Log使用,特别是Log.v, Log.d, Log.i, Log.w, 和 Log.e这五个主要的日志级别。 首先,我们来了解每个级别的具体含义和用途: 1. **Log.v()** - 代表VERBOSE级别,输出最详细的信息,通常...

    android源码之log.h

    Android源码,/platform/system/core/include/cutils/log.h

    log.js只使用一行代码即可轻松获取前端日志

    `log.js` 可能会提供多种日志级别,如 `debug`、`info`、`warn` 和 `error`,以满足不同场景的需求。这些级别的选择可以帮助你过滤掉不必要的日志信息,使日志更具有针对性。例如,你可以在开发阶段使用 `debug` ...

    if.rar_If..._跳转

    - **嵌套使用**:`if` 语句可以嵌套在其他 `if` 语句中,形成多层条件判断,以实现更复杂的逻辑。 2. **跳转语句** - **break**:在循环或switch结构中,`break` 语句用于立即退出当前循环或switch,执行后续的...

    log4j详解配置说明

    if (log.isDebugEnabled()) { log.debug("Debug message"); } if (log.isInfoEnabled()) { log.info("Info message"); } if (log.isWarnEnabled()) { log.warn("Warning message"); } if (log....

    Android显示Log信息(带行号)

    Android系统自带的Log工具提供了基本的日志输出功能,包括`Log.v()`(verbose)、`Log.d()`(debug)、`Log.i()`(info)、`Log.w()`(warn)、`Log.e()`(error)等方法,但它们默认并不显示行号。在复杂项目中,...

    log4j.properties 的使用详解(含log4j.properties)

    《log4j.properties 使用详解》 在Java开发中,日志记录是一项不可或缺的工作,它能够帮助开发者追踪程序运行状态,定位错误,优化性能。而log4j作为一款强大的日志框架,广泛应用于各种Java项目中。本文将详细介绍...

    usbLog(U盘使用记录查看)

    在实际应用中,USBLog.exe是USBLog的可执行文件,用户可以直接运行这个程序来启动USBLog的服务。通常,为了持续监控USB设备,用户需要设置USBLog在系统启动时自动运行,并将日志保存在指定的位置。此外,根据需要,...

    nf_log.rar_The Real

    而"nf_log.h"则是对应的头文件,包含了相关的函数声明和数据结构定义,供其他模块调用和使用。这两个文件共同构成了内核网络日志子系统的实现。 3. **LOG目标模块(LOG Target Modules)** “Real LOG target ...

    log4j.properties(完整版) log4j.properties(精简版)

    精简版的`log4j.properties`仅包含必要的配置,适用于简单场景。比如: - 只有一个输出到控制台的Appender,没有日志文件。 - 全局日志级别设置为INFO或ERROR,不记录DEBUG级别的日志。 - 日志格式简化,只包含日期...

    FD_log.rar_c++ unicode日志

    `FD_log.c`可能包含函数的实现,而`FD_log.h`则可能包含了相关的函数声明和结构定义,使得其他源文件可以方便地使用这个日志系统。 下面是一个基本的日志记录类的概览,它支持多字节字符集(MBCS)和Unicode编码: ...

    log4j与log4j.properties的配置.doc

    1. 在应用程序中使用 Log4j,需要将 Log4j 库文件(log4j-*.jar)添加到 CLASSPATH 变量中。 2. 新建一个配置文件 log4j.properties,放于 bin 文件下。 二、log4j.properties 配置文件 log4j.properties 配置文件...

    如何使用Log4j如何使用Log4j

    if (log.isDebugEnabled()) { log.debug("System property: " + System.getProperty("java.version")); } ``` 使用`isDebugEnabled()`方法判断当前Logger是否开启DEBUG级别,如果开启了,则调用`debug()`方法...

    2018-getlog.rar

    (进阶)AWS DeepRacer分析log-002 log 原始数据 可与 我的博客 https://rambo.blog.csdn.net/article/details/120682010 配套使用更佳

    javax.servlet.jar and org.apache.commons.logging.Log.jar

    javax.servlet.jar and org.apache.commons.logging.Log.jar javax.servlet.jar and org.apache.commons.logging.Log.jar

    log4j日志使用说明

    if (log.isDebugEnabled()) { log.debug("System ..."); } } } ``` #### 五、Log4j的高级特性 Log4j除了基本的日志记录功能外,还支持许多高级特性,比如: - **多语言接口**:不仅支持Java,还可以通过其他...

    Log4Net使用demo Log4Net.dll

    log.Debug("这是调试信息"); log.Info("这是信息"); log.Warn("这是警告"); log.Error("这是错误"); log.Fatal("这是致命错误"); } ``` 这段代码首先通过LogManager获取一个Logger实例,然后调用不同级别的Log...

Global site tag (gtag.js) - Google Analytics