为什么要使用isDebugEnabled()

之前在系统的代码中发现有时候会在打印日志的时候先进行一次判断,如下:

if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Search parameters: " + searchParams);
}

我们使用的是Log4j2框架,框架自身提供了类似的许多api,比如isErrorEnabled()isInfoEnabled()等,每个Level对有对应的一个判断Level是否启用的api,实际上这些api都是调用的另一个api:isEnabled

在打印日志之前先进行Level的判断,是因为在执行打印语句时,首先会先将要打印的字符串信息作为参数传递给被调用的方法。如下代码:

LOGGER.debug("Search parameters: " + searchParams);

首先会执行字符串拼接的操作,会涉及到对象的toString()方法以及StringBuilder的创建,接着把拼接后的字符串传递给debug语句,这时候才会去判断打印日志的级别,来决定是否将这个字符串输入到对应的日志文件里。假如最终该语句并不会把字符串打印出来,那么这个拼接字符串的过程就属于毫无意义的操作,会增加系统性能的损耗。

因此,在一些必要的地方,我们会先进行一次日志Level的判断,来避免不必要的性能损耗。

使用{}占位符来打印日志

Log4j在升级到Log4j2后提供了新的打印日志的方式:允许使用{}占位符来打印日志,如下:

LOGGER.debug("Search parameters: {}", searchParams);

通过占位符来打印日志有个好处,那就是不需要自己去预先判断日志的级别,其底层已经帮我们去实现这个步骤了。此外,使用占位符来打印日志,对于需要拼接大量变量的场景时,该方式也会更加地直观与优雅。如下:

LOGGER.debug("Current item id is {}, size is {}, color is {}, pattern is {}.", id, size, color, pattern);

注意:在Log4j2中,这种占位符打印的方式,最多只能支持到9个变量参数。

除了Log4j2,其它的日志框架同样支持占位符的写法,比如logback等。

使用{}占位符可能产生的问题

虽然使用占位符来打印日志很方便,但是却有可能引发堆栈溢出的问题,有兴趣的话可以通过这篇文章来了解下。

参考链接

Log4j2 - 日志框架中isDebugEnabled()的作用的更多相关文章

  1. 浅谈Log4j2日志框架及使用

    目录 1.日志框架 2.为什么需要日志接口,直接使用具体的实现不就行了吗? 3.log4j2日志级别 4.log4j2配置文件的优先级 5.对于log4j2配置文件的理解 6.对于Appender的理 ...

  2. Log4j2日志框架集成Slf4j日志门面

    1.说明 本文介绍使用日志门面Slf4j打印日志, 底层日志实现使用Log4j2框架, 方便以后切换底层日志实现, Log4j2可以替换成Logback等. 2.依赖管理 在pom.xml依赖管理中导 ...

  3. log4j2 日志框架小记

    这两天开始学习日志框架了, 把常用的学习一下,记录一下.上篇日志写了log4j-----https://www.cnblogs.com/qiaoyutao/p/10995895.html今天就总结一下 ...

  4. Java日志框架中真的需要判断log.isDebugEnabled()吗?

    在项目中我们经常可以看到这样的代码: if (logger.isDebugEnabled()) { logger.debug(message); } 简单来说,就是用isDebugEnabled方法判 ...

  5. SSM框架中各层作用

    SSM是sping+springMVC+mybatis集成的框架. MVC即model view controller. model层=entity层.存放我们的实体类,与数据库中的属性值基本保持一致 ...

  6. PHP框架中.htaccess文件作用

    1..htaccess文件使用前提 .htaccess的主要作用就是实现url改写,也就是当浏览器通过url访问到服务器某个文件夹时,作为主人,我们可以来接待这个url,具体地怎样接待它,就是此文件的 ...

  7. C# mvc--ORM框架中EF的作用和特点

    存放于System.Linq.QueryAble 静态类中 并且所有的扩展方法扩展自 IqueryAble<TSource>泛型接口上 用途: 接收lambda表达式 利用EF生成对应的s ...

  8. springboot日志框架学习------slf4j和log4j2

    springboot日志框架学习------slf4j和log4j2 日志框架的作用,日志框架就是用来记录系统的一些行为的,可以通过日志发现一些问题,在出现问题之后日志是好的一个帮手. 市面上的日志框 ...

  9. Spring Boot Log4j2 日志学习

    简介 Java 中比较常用的日志工具类,有: Log4j. SLF4j. Commons-logging(简称jcl). Logback. Log4j2(Log4j 升级版). Jdk Logging ...

随机推荐

  1. javascript 之 命名空间

    注意点: 1/IIFE是现代js框架最主要的基础设施,保证变量不被污染. 2/基本上我们把命名空间等同于框架的名字. 内容 一.简单的命名空间 <input type="button& ...

  2. SVN_01概念

    客戶端TortoiseSVN  服务器端VIsualSVN SVN是Apache Subversion的缩写,是一个开放源代码的版本控制系. 这些数据放置在一个中央资料库(repository)中.这 ...

  3. 最近跟进一个CS项目,用到c#基础知识,准备开个分类记录一下

    C#在txt类文件中追加内容 string path = "test.txt";FileStream mystream = new FileStream(path, FileMod ...

  4. 了解Scrum敏捷开发过程的优点

    Scrum 1. 我们的团队 1.1 团队名称 开发小分队&7号 1.2 团队成员 徐棒 彭康明 刘鹏芝 罗樟 王小莉 胡广健 沈兴艳 1.3 我在团队中位置 需求实现团队(负责将需求模块实现 ...

  5. Authorization Bypass in RSA NetWitness

    https://www.cnblogs.com/iAmSoScArEd/ SEC Consult Vulnerability Lab Security Advisory < 20190515-0 ...

  6. JDBCUtils工具类配置文件的读取方式

    //第一种方式 Properties prop= new Properties();        //读取文件   通过类加载读取        InputStream is = JDBCUtils ...

  7. django_rest framework 接口开发(一)

    1 restful 规范(建议) 基于FbV def order(request): if request.method=="GET": return HttpResponse(' ...

  8. Go数据类型之基本数据类型

    不想沦为芸芸众生的人只需做一件事,便是对自己不再散漫:他应当听从良知的呼唤:“成为你自己!” ---尼采 1.整型 有符号整数类型:int8.int16.int32和int64 无符号整数类型:uin ...

  9. Linux sudo(CVE-2019-14287)漏洞复现过程

    简述: 该漏洞编号是CVE-2019-14287. sudo是Linux系统管理指令,允许用户在不需要切换环境的前提下用其他用户的权限运行程序或命令,通常是以root身份运行命令,以减少root用户的 ...

  10. 运维开发笔记整理-JsonResponse对象

    运维开发笔记整理-JsonResponse对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用HttpResponse发送json格式的数据 1>.HttpRespo ...