14 October 2015

这几天在读Spring MVC源码时,发现了如下代码:

if (logger.isDebugEnabled()) {
    logger.debug("Using ThemeResolver [" + this.themeResolver + "]");
}

初看有些不解,觉着在设置了高于debug级别的log输出时,logger.debug(…)原本就不会输出,为什么还需要logger.isDebugEnabled()。

在org.apache.commons.logging.Log的代码注释中找到了答案:

 * <p>Performance is often a logging concern.
 * By examining the appropriate property,
 * a component can avoid expensive operations (producing information
 * to be logged).</p>
 *
 * <p> For example,
 * <code><pre>
 *    if (log.isDebugEnabled()) {
 *        ... do something expensive ...
 *        log.debug(theResult);
 *    }
 * </pre></code>
 * </p>

也就是说,是为了避免一些logger.debug(…)准备工作的执行,从而提高性能。至于本文提到的例子,应该属于最简单的情况,避免无用的String参数拼接。

相应的,也不是只有debug级别才有这个方法,每一个log级别都有对应的enabled方法供调用。org.apache.commons.logging.Log接口的代码如下,供参考。

public interface Log {

    // ----------------------------------------------------- Logging Properties

    public boolean isDebugEnabled();

    public boolean isErrorEnabled();

    public boolean isFatalEnabled();

    public boolean isInfoEnabled();

    public boolean isTraceEnabled();

    public boolean isWarnEnabled();

    // -------------------------------------------------------- Logging Methods

    public void trace(Object message);

    public void trace(Object message, Throwable t);

    public void debug(Object message);

    public void debug(Object message, Throwable t);

    public void info(Object message);

    public void info(Object message, Throwable t);

    public void warn(Object message);

    public void warn(Object message, Throwable t);

    public void error(Object message);

    public void error(Object message, Throwable t);

    public void fatal(Object message);

    public void fatal(Object message, Throwable t);

}


blog comments powered by Disqus