zoukankan      html  css  js  c++  java
  • Log4j的isdebugEnabled的作用

    转自:https://www.iteye.com/blog/zhukewen-java-1174017

    在项目中我们经常可以看到这样的代码:

    if (logger.isDebugEnabled()) {

        logger.debug(message);

    }

        有些人不明白为什么要这样写。有些人认为这样是为了能够控制日志的输出,对于下面这行代码,

     logger.debug(message);

        他们的看法是:如果这样写的话,就算你把日志级别调整为info, 这里也会输出日志。

        其实,在debug()方法里面,就已经叛断了日志的级别。以下是isDebugEnabled()的源码:

    public boolean isDebugEnabled() {    

      if(repository.isDisabled( Level.DEBUG_INT))

          return false;

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

      }

        以下是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()方法里做了跟isDebugEnabled()方法一样的判断。

        在这里,我们不禁会想,那我们凡是要输日志的地方,都不判断isDebugEnabled,直接调debug方法,不更省事吗?

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

        我们来看下面一行代码:

            logger.debug("The money is " + getTotalMoney());

    假设我们的日志级别设置为info,那这句话不会输出日志,但这个方法还是会调用。要调用这个方法,必须提供参数。getTotalMoney()方法返回的结果就是参数的一部分。假设getTotalMoney()要执行10秒钟,10秒钟后,进入到debug()方法里,碰到了第一个判断:

    if(repository.isDisabled(Level.DEBUG_INT))

          return;

     在这里就返回了。结果是日志虽然没有输出,却花费了10秒钟来构造参数。很显然这里得不偿失的。尽管实际应用中几乎不可能有这种花10秒钟来构造这样一个参数的情况,但如果并发数大的话,这样写还是会影响系统的性能的。这个时候,就应该写成:

    if(logger.isDebugEnabled()){

    logger.debug("The money is " + getTotalMoney());

     如果debug的参数很简单的话,也可以直接写 logger.debug(message)的。官方的说法,执行一次logger.isDebugEnabled()这样的判断花费的时间大概是写日志时间的万分之一.虽然这个比例很小,

      但是,程序中的任何地方放到并发的环境下,我们就得重新考虑了。

      所以,我觉得,我们开发的时候, 应该视具体的情况选择不同的写法。

      第一次在这里发文,虽然自己技术很菜,但丑媳妇总归是要见家娘,技术应是百花争呜,不应一家独大,否则全世界就只能是那几个大拿写技术文章了。在这写写自己心得,交流交流技术, 引引玉,总归是件有意义的事。

  • 相关阅读:
    常用知识点集合
    LeetCode 66 Plus One
    LeetCode 88 Merge Sorted Array
    LeetCode 27 Remove Element
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 448 Find All Numbers Disappeared in an Array
    LeetCode 219 Contains Duplicate II
    LeetCode 118 Pascal's Triangle
    LeetCode 119 Pascal's Triangle II
    LeetCode 1 Two Sum
  • 原文地址:https://www.cnblogs.com/isme-zjh/p/11820487.html
Copyright © 2011-2022 走看看