Log4j中isDebugEnabled作用
时间:2022-07-22
本文章向大家介绍Log4j中isDebugEnabled作用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
参考1:isDebugEnabled作用 参考2:Java日志框架中真的需要判断log.isDebugEnabled()吗?
在项目中经常会看到这样的代码:
if (logger.isDebugEnabled()) {
logger.debug(message);
}
为什么要这样做呢?
且看isDebugEnabled()
的源码:
public boolean isDebugEnabled() {
if(repository.isDisabled( Level.DEBUG_INT)) // Level范围值作为参数,返回true
return false;
return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
}
实际调用的是NOPLoggerRepository.isDisabled()
:
public boolean isDisabled(final int level) {
return true;
}
再看debug()
的源码:
public void debug(String msg) {
this.logger.log(FQCN, Level.DEBUG, msg, (Throwable)null);
}
继续往下追踪log()
的源码:
public void log(String callerFQCN, Priority level, Object message, Throwable t) {
if(repository.isDisabled(level.level)) {
return;
}
if(level.isGreaterOrEqual(this.getEffectiveLevel())) {
forcedLog(callerFQCN, level, message, t);
}
}
实际调用的也是NOPLoggerRepository.isDisabled()
:
public boolean isDisabled(final int level) {
return true;
}
可见,debug()
中做了跟isDebugEnabled()
几乎一样的判断,看起来直接调用debug()
比先判断isDebugEnabled()
更加效率。
此时来看下面的代码:
log.debug("message:" + user.getMessage());
假如我们的日志级别为info
,那么这句话不会被输出,但是这样写,这个方法还是会调用,因此getMessage()
方法还是会执行。如果getMessage()
这个方法过于复杂,需要很长时间来执行。而参数构造完之后,我们进入debug()
方法进行判断
if(repository.isDisabled(level.level)) {
return;
}
在这里就返回了。这样会导致我们什么都没有做但却耗费了时间,如果并发量大的时候,对性能的影响就比较明显了。假设这个获取参数的过程需要10秒钟,则系统会在花费10秒后决定return,这显然很得不偿失。
这个时候,出于性能的考虑,我们就应当添加isDebugEnabled()
判断
if (logger.isDebugEnabled()) {
logger.debug("message:" + user.getMessage());
}
但是如果是这样简单的输出:
logger.debug("error");
添加判断就没有必要了。
- Android内存优化(六)LeakCanary使用详解
- Spring Cloud构建微服务架构:服务消费(Feign)【Dalston版】
- React Native组件(四)TextInput组件解析
- struts2实现ajax校验的2种方法
- 单例对象
- Android+struts2+json方式模拟手机登录功能
- iOS 获取通讯录里边的电话号码AddressBook
- InvocationTargetException异常解析
- Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】
- java基础多线程之共享数据
- Spring Boot自动化配置的利弊及解决之道
- Java四种引用解析以及在Android的应用
- java基础之泛型
- java基础之反射
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何使用PyMysql操作MySQL数据库?
- 【redis】部署及参数详解(吐血整理,建议收藏)
- 【MySQL性能调优】-关于索引的那些事儿(一)
- 【索引潜规则】-覆盖索引、ICP、MRR详解
- 微服务[学成在线] day12:基于 Nuxt.js 构建搜索前端工程
- 别找了,你要的Redis命令都在这了
- 微服务[学成在线] day13:使用FFmpeg进行格式转换以及m3u8文件生成、文件分块上传接口实现
- GTID,你了解多少?
- Spring Boot 拓展SpringMVC
- Spring Boot 日志配置
- R语言进阶之图形参数
- 第04期:Prometheus 数据采集(三)
- 技术分享 | Online DDL 工具 gh-ost
- Spring Boot 整合Mybatis
- R语言进阶之时间序列分析