Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Log4j中isDebugEnabled作用

Log4j中isDebugEnabled作用

作者头像
Remember_Ray
发布于 2020-08-03 15:22:19
发布于 2020-08-03 15:22:19
3.2K00
代码可运行
举报
文章被收录于专栏:Ray学习笔记Ray学习笔记
运行总次数:0
代码可运行

参考1:isDebugEnabled作用 参考2:Java日志框架中真的需要判断log.isDebugEnabled()吗?

在项目中经常会看到这样的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (logger.isDebugEnabled()) {
    logger.debug(message);
}

为什么要这样做呢?

且看isDebugEnabled()的源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public boolean isDebugEnabled() {
  if(repository.isDisabled( Level.DEBUG_INT))  // Level范围值作为参数,返回true
    return false;
  return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
}

实际调用的是NOPLoggerRepository.isDisabled()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public boolean isDisabled(final int level) {
    return true;
}

再看debug()的源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void debug(String msg) {
    this.logger.log(FQCN, Level.DEBUG, msg, (Throwable)null);
}

继续往下追踪log()的源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public boolean isDisabled(final int level) {
    return true;
}

可见,debug()中做了跟isDebugEnabled()几乎一样的判断,看起来直接调用debug()比先判断isDebugEnabled()更加效率。


此时来看下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
log.debug("message:" + user.getMessage());

假如我们的日志级别为info,那么这句话不会被输出,但是这样写,这个方法还是会调用,因此getMessage()方法还是会执行。如果getMessage()这个方法过于复杂,需要很长时间来执行。而参数构造完之后,我们进入debug()方法进行判断

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(repository.isDisabled(level.level)) {
    return;
}

在这里就返回了。这样会导致我们什么都没有做但却耗费了时间,如果并发量大的时候,对性能的影响就比较明显了。假设这个获取参数的过程需要10秒钟,则系统会在花费10秒后决定return,这显然很得不偿失。

这个时候,出于性能的考虑,我们就应当添加isDebugEnabled()判断

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (logger.isDebugEnabled()) {
   logger.debug("message:" + user.getMessage());
}

但是如果是这样简单的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
logger.debug("error");

添加判断就没有必要了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-15|,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
阿里Java编码手册实战详解-日志篇
1. 【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
JavaEdge
2020/05/27
5570
一看就懂的适配器设计模式
一般客户端通过目标类的接口访问它所提供的服务。有时,现有类可以满足客户端类的需要,但所提供接口不一定是客户端所期望的,可能因为现有类中方法名与目标类中定义的方法名不一致。
JavaEdge
2022/05/29
4290
一看就懂的适配器设计模式
设计模式 | 结构型 | 适配器模式
java.util.Collections#list()、#enumeration()
被水淹没
2023/02/25
3510
设计模式 | 结构型 | 适配器模式
slf4j中有典型适配器模式,不看一看?
1、《聊聊这些年我们用过的Java日志框架》 2、《slf4j框架源码中是如何实现双重锁的?》 3、《slf4j中是如何运用SPI机制兼容各类日志框架的?》 4、《slf4j是如何绑定具体的日志框架的?》 5、《slf4j中的桥接器是如何运作的?》
程序新视界
2020/12/08
7580
slf4j的log.warn()的参数问题研究
发现前面是format格式化字符串,后面是对应的参数。格式化的占位符(即“{}”)和后面的参数一一对应。
明明如月学长
2021/08/31
3450
slf4j的log.warn()的参数问题研究
log4j的终极封装
通用型(再也不用每个类new一个logger了) public class Log { private static Map<String,Logger> loggerMap = new HashMap<String,Logger>(); public static void main(String[] args) throws ClassNotFoundException { Log.error("自定义LOG","sss444444"); }
ydymz
2018/09/10
6440
【Java NIO空轮询bug和Netty中的解决方法】
1、问题提出 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6670302 简单来说:epoll机制是Linux下一种高效的
用户5640963
2020/03/19
1.5K0
log.error()底层到底做了些啥?
今天给大家介绍一下logback日志,底层是如何实现的。这边我们打印一下error级别的日志,看看从log.error到输出磁盘,这个过程中到底发生了些什么,并从源码级别揭秘整个日常的输出过程。
林老师带你学编程
2020/03/18
1K0
log.error()底层到底做了些啥?
天啦撸!打印日志竟然只晓得 Log4j?
空了的时候,我都会在群里偷偷摸摸地潜水,对小伙伴们的一举一动、一言一行筛查诊断。一副班主任的即时感,让我感到非常的快乐,略微夹带一丝丝的枯燥。
沉默王二
2020/11/03
3760
天啦撸!打印日志竟然只晓得 Log4j?
基于Redis实现分布式消息队列(二)
1、访问Redis的工具类 public class RedisManager {
后端技术探索
2018/08/09
6500
如何搞定Mybatis 中的 9 种设计模式
虽然我们都知道有很多设计模式,但是大多停留在概念层面,真实开发中很少遇到,Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式。
田维常
2019/07/16
4900
如何搞定Mybatis 中的 9 种设计模式
MyBatis设计思想(2)——日志模块
适配器模式的作用:将一个接口转换成满足客户端期望的另一个接口,使得接口不兼容的那些类可以一起工作。
张申傲
2020/09/03
5040
MyBatis设计思想(2)——日志模块
项目开发中正确的打日志姿势ERROR:WARNINFO:TRACE
使用slf4j 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 实现方式统一使用: Logback框架 打日志的正确方式 什么时候应该打日志 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统,是可以通过日志进行问题定为的。 当你碰到if…else 或者 switch这样的分支时,要在分支的首行打印日志,用来确定进入了哪个分支 经常以功能为核心进行开发,你应该在提交代码前,可以确定通过日志可以看到整个流程
JavaEdge
2018/08/10
5860
项目开发中正确的打日志姿势ERROR:WARNINFO:TRACE
web项目中如何选择日志组件(SLF4J、Log4J2、logback)
    为什么使用SLF4J与其他组件结合使用比单独使用log4j2或者java.util.logging要优秀呢。
洋仔聊编程
2019/01/15
4.8K0
log4j的常用使用方法
第三步,创建配置文件log4jconfig.properties,放在src目录下(配置文件具体属性无需研究的太懂)
HUC思梦
2020/09/03
5460
为什么要使用SLF4J而不是Log4J
本文由 ImportNew - Jaskey 翻译自 javarevisited。欢迎加入翻译小组。转载请见文末要求。
sanmutongzi
2020/03/05
6990
Apache Log4j2从RCE到RC1绕过
Log4j2是Java开发常用的日志框架,该漏洞触发条件低,危害大,由阿里云安全团队报告
亿人安全
2022/06/30
4120
Apache Log4j2从RCE到RC1绕过
还在用Logback?Log4j2的异步性能已经无敌了,还不快试试
Logback 算是JAVA 里一个老牌的日志框架,从06年开始第一个版本,迭代至今也十几年了。不过logback最近一个稳定版本还停留在 2017 年,好几年都没有更新;logback的兄弟 slf4j 最近一个稳定版也是2017年,有点凉凉的意思。
JAVA日知录
2021/04/23
1.2K0
为什么要求开发者对Logger再封装 发布于
在《嵩山版阿里Java开发手册》的日志规约中第一条明确规定了:应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 (SLF4J、JCL--Jakarta Commons Logging)中的 API,使用门面模式的日志框架开发。
DioxideCN
2023/10/21
3680
为什么要求开发者对Logger再封装
                        
                            发布于
MyBatis源码解析之基础模块—Log
上一章节我们一起学习了DataSource源码逻辑。本次我们学习MyBatis的Log日志处理模块。
todobugs
2020/10/21
1.1K0
MyBatis源码解析之基础模块—Log
相关推荐
阿里Java编码手册实战详解-日志篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验