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()这样的判断花费的时间大概是写日志时间的万分之一.虽然这个比例很小,
但是,程序中的任何地方放到并发的环境下,我们就得重新考虑了。
所以,我觉得,我们开发的时候, 应该视具体的情况选择不同的写法。
第一次在这里发文,虽然自己技术很菜,但丑媳妇总归是要见家娘,技术应是百花争呜,不应一家独大,否则全世界就只能是那几个大拿写技术文章了。在这写写自己心得,交流交流技术, 引引玉,总归是件有意义的事。
Log4j的isdebugEnabled的作用的更多相关文章
- paip.Log4j配置不起作用的解决
paip.Log4j配置不起作用的解决 1.jar包里的log4j配置 看累挂jar,真的有个" webservices-rt.jar\com\sun\org\apache\xml\inte ...
- log4j中isDebugEnabled(), log.isInfoEnabled()和log.isTraceEnabled的封装
1. log4j中log.isDebugEnabled(), log.isInfoEnabled()和log.isTraceEnabled()作用 项目在应用log4j打印Debug,Info和Tra ...
- Log4j2 - 日志框架中isDebugEnabled()的作用
为什么要使用isDebugEnabled() 之前在系统的代码中发现有时候会在打印日志的时候先进行一次判断,如下: if (LOGGER.isDebugEnabled()) { LOGGER.debu ...
- log4j的学习和log4j在程序中使用的加载作用过程
昨天进行代码评审的时候,大家都纠结在了日志信息应该如何输出上,其实我想大家应该一直都在使用log4j来对日志信息进行输出,但是未想应该有很大一部分人对log4j是不了解的,我遇到这个问题的时候也到网上 ...
- commons-logging和Log4j 日志管理/log4j.properties配置详解
commons-logging和Log4j 日志管理 (zz) 什么要用日志(Log)? 这个……就不必说了吧. 为什么不用System.out.println()? 功能太弱:不易于控制.如果暂时不 ...
- (转)log4j(六)——log4j.properties简单配置样例说明
一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 1 老规矩,先来个栗子,然后再聊聊感受 (1)使用配文件的方式,是不是感觉非常的清爽,如果不在程序中读取配置文件就更加的清 ...
- log4j.properties 日志文件的详细配置说明
一.在一个web 项目中,使用tomcat 启动通常会在控制台输出出现一个警告信息: 通常为未添加 log4j.properties文件的原因. 二.下面以一个普通的maven项目为例说明一下 1. ...
- (转)log4j(六)——log4j.properties试过过程详解
一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 参考:https://www.cnblogs.com/ywlaker/p/6124067.html log4j基本用法 首 ...
- log4j和commons- logging(好文整理转载)
一 :为什么同时使用commons-logging和Log4j?为什么不仅使用其中之一? Commons-loggin的目的是为 “所有的Java日志实现”提供一个统一的接口,它自身的日志功能平常弱( ...
随机推荐
- 论文阅读笔记(十六)【AAAI2018】:Region-Based Quality Estimation Network for Large-Scale Person Re-Identification
Introduction (1)Motivation: 当前的行人重识别方法都只能在标准的数据集上取得好的效果,但当行人被遮挡或者肢体移动时,往往效果不佳. (2)Contribution: ① 提出 ...
- java简单验证码生成程序
下面的函数,返回的字符串就是所需验证码 public String id(){ Random ra =new Random(); st=""; String [] w= {&quo ...
- gulp常用插件之gulp-notify使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-notify这是一款gulp通知插件. 更多使用文档请点击访问gulp-notify工具官网. 安装 一键安装不多解释 npm inst ...
- gulp常用插件之bower使用
更多gulp常用插件使用请访问:gulp常用插件汇总 bower这是一款客户端技术的软件包管理器,它可用于搜索.安装和卸载如JavaScript.HTML.CSS之类的网络资源. 更多使用文档请点击访 ...
- IO流学习之字符流(三)
IO流之字符流缓冲区: 概念: 流中的缓冲区:是先把程序需要操作的数据保存在内存中,然后我们的程序读写数据的时候,不直接和持久设备之间交互,而改成和内存中的数据进行交互. 缓冲区:它就是临时存储数据, ...
- codechef Counting D-sets
难度 \(hard\) 题意 官方中文题意 做法 为避免数重,强制每维至少有一个\(0\),这个可以简单容斥 直径恰好为\(d\),不好求,也容斥一下
- MS SQLServer相关自动化程序的问题汇总 (SQLServer每天定时输出EXCEL或xml的格式的问题等 )
· MS SQLServer相关问题 1. 使用MS SQLServer每天定时输出EXCEL格式的文件,实现每天的Excel报表导出 2. 使用MS SQLServer每天定时输出xml格式的文件, ...
- STM32CubeMX自建MDK工程的基本步骤
根据需要调节各总线频率 最下方选项,√去掉,不用实时更新库,选择自己库所在路径就好. 点击左侧, 选择"Code Generator", 选择.c 和 .h文件不分开 最后,点击& ...
- C++->List的使用注释
List容器的应用: //----------单链队列-------队列的链式存储结构--------------- typedef struct QNode{ ...
- ECMAScript基本对象——Boolean对象
1.创建 var myBoolean=new Boolean(); 2.方法 toString()把布尔值转换为字符串,并返回结果 valueOf()返回 Boolean 对象的原始值. 3.属性 1 ...