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

  1. if (logger.isDebugEnabled()) {
  2. logger.debug(message);
  3. }

简单来说,就是用isDebugEnabled方法判断下是能提升性能的!!

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

  1. logger.debug(message);

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

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

  1. public boolean isDebugEnabled() {
  2. if(repository.isDisabled( Level.DEBUG_INT))
  3. return false;
  4. return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
  5. }

以下是debug()的源码:

  1. public void debug(Object message) {
  2. if(repository.isDisabled(Level.DEBUG_INT))
  3. return;
  4. if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
  5. forcedLog(FQCN, Level.DEBUG, message, null);
  6. }
  7. }

我们可以看到,在debug()方法里做了跟isDebugEnabled()方法一样的判断。

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

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

我们来看下面一行代码:

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

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

转载:https://blog.csdn.net/after_you/article/details/69802590

  1. if(repository.isDisabled(Level.DEBUG_INT))
  2. return;

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

  1. if(logger.isDebugEnabled()){
  2. logger.debug("The money is " + getTotalMoney());
  3. }

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

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

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

Java日志框架中真的需要判断log.isDebugEnabled()吗?的更多相关文章

  1. Log4j2 - 日志框架中isDebugEnabled()的作用

    为什么要使用isDebugEnabled() 之前在系统的代码中发现有时候会在打印日志的时候先进行一次判断,如下: if (LOGGER.isDebugEnabled()) { LOGGER.debu ...

  2. Java日志框架那些事儿

    文章首发于[博客园-陈树义],点击跳转到原文Java日志框架那些事儿. 在项目开发过程中,我们可以通过 debug 查找问题.而在线上环境我们查找问题只能通过打印日志的方式查找问题.因此对于一个项目而 ...

  3. Java程序员最常用的8个Java日志框架

    转自:http://www.codeceo.com/article/8-java-log-framework.html 作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用 ...

  4. 转:Java程序员最常用的8个Java日志框架

    作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug:在 ...

  5. Java基础学习总结(40)——Java程序员最常用的8个Java日志框架

    作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug:在 ...

  6. Java-最常用的Java日志框架整理

    Java-最常用的Java日志框架整理 前言 Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日 ...

  7. java日志框架系列(4):logback框架xml配置文件语法

    1.xml配置文件语法 由于logback配置文件语法特别灵活,因此无法用DTD或schema进行定义. 1.配置文件基本结构 配置文件基本结构:以<configuration>标签开头, ...

  8. Java 日志框架终极教程

    概述 对于现代的 Java 应用程序来说,只要被部署到真实的生产环境,其日志的重要性就是不言而喻的,很难想象没有任何日志记录功能的应用程序被运行于生产环境中.日志 API 所能提供的功能是多种多样的, ...

  9. 第49节:Java集合框架中底层文档的List与Set

    Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...

随机推荐

  1. 算警示吧——此文来自张鑫旭(说说CSS学习中的瓶颈)

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2523 虽已数年,但未 ...

  2. elixir 模块

    模块定义  defmodule 函数定义  def 私有函数  defp  --相当于其他语言 private iex(29)> defmodule Math do...(29)> def ...

  3. Android埋点技术分析

    1.现有的几种埋点技术的实现原理和优劣分析 (1)代码埋点:将收集数据的代码直接写在需要的地方,当用户点击某个控件或者打开某个页面时调用到该部分代码完成数据的收集. 优势:准确性高,收集数据和发送数据 ...

  4. android 自定义控件之ViewGroup生命周期执行步骤

    前言 了解ViewGroup的生命周期的执行步骤对于自己自定义ViewGroup的时候十分重要,清楚了整个流程才能对ViewGroup有更深的理解.本文从个人的总结,来阐述一下执行的顺序.执行说明 首 ...

  5. 机器学习vs深度学习及其知识点

    人工智能如火如荼,可以遇见这将会是近10年最大的创新机会.那么到底什么是人工智能? 机器学习和神经网络什么关系? 卷积神经网络中的矩阵内积是怎么计算的?

  6. Vue2学习笔记:html属性

    1.使用 <!DOCTYPE html> <html> <head> <title></title> <meta charset=&q ...

  7. Jmeter入门--关联

    名称解释 关联是请求与请求之间存在数据依赖关系,需要从上一个请求获取下一个请求需要回传回去的数据. 具体方法 Jmeter关联有两种方法:Xpath.正则表达式 方法一:Xpath主要用于响应是格式是 ...

  8. B-树特征

    在m阶B-树的定义中,要求: 1.树中每个节点至多有m棵子树. 2.若根节点不是叶子节点,则至少有两棵子树. 3.除根之外的所有非终端节点至少有棵子树.

  9. Hadoop HBase概念学习系列之HBase里的Client(二十二)

    这个,很简单,但凡是略懂大数据的,就很清楚,不多说,直接上图.

  10. Ardunio控制RGB的LED灯显示彩虹渐变色.

    由于我使用的是共阴极的RGB LED,如果你的是共阳极的,接线的时候要注意一下. 其他没什么不同 //定义RGB色彩的输出I/O ; ; ; //标记颜色变化的方式,增加值还是减小值 bool red ...