`
kang
  • 浏览: 474333 次
  • 性别: 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

    nginx日志测试使用 access.log.zip

    `access.log.zip`是一个压缩包,里面包含了Nginx服务器生成的访问日志记录,接下来我们将深入探讨Nginx日志的结构、用途及分析方法。 Nginx的默认日志格式(也称为`combined`格式)如下: ``` $remote_addr - $...

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

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

    seata-oracle版undolog.sql

    oracle版本的undolog建表语句。 2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地...

    log4j详解配置说明

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

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

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

    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编码: ...

    usbLog(U盘使用记录查看)

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

    如何使用Log4j如何使用Log4j

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

    C++项目写日志文件log.h

    #include"log.h" StdAfx.cpp Logger_mgr* Logger_mgr::pmyself = NULL; logger_dayfile lgdayfile("Logs", "AppLogFile"); logger_base * Logger_mgr::pmylogger = &lgdayfile; // 在项目中需要的地方写日志信息 ...

    spdlog,VC2022外部依赖库

    #include <spdlog/spdlog.h> int main() { auto console = spdlog::stdout_color_mt("console_logger"); console->info("Hello, spdlog!"); return 0; } ``` 在这个例子中,"console_logger" 是日志实例的名称,...

    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,还可以通过其他...

    eventlog_0.2.12.tar.gz

    总结来说,"eventlog_0.2.12"是跨平台日志管理的利器,通过解压缩并使用其中的工具,无论是Windows还是UNIX/Linux系统的管理员,都能更有效地管理和利用系统日志,提升运维效率,保障系统的稳定性和安全性。

    走前端学js练if语句.rar

    4. **嵌套if**:在一个if语句内部再使用if语句。 5. **switch语句**:作为if...else的替代,处理多个可能的分支。 6. **数组和对象的条件检查**:检查数组中是否存在某个元素,或者对象属性的值满足条件。 7. **函数...

Global site tag (gtag.js) - Google Analytics