log4j2 无日志记录_在Log4j2中更好地执行非日志记录器调用

log4j2 无日志记录

使用Log4j 1.x并希望避免在某些情况下可能会造成额外的性能影响(即使实际上未记录该消息)时,通常使用日志记录防护 。 Java的简单日志记录外观 ( SLF4J )带给Java日志记录的最吸引人的功能之一是能够减少需要进行这些日志级别检查的情况的数量 。 在本文中,我将探讨如何使用Log4j 2.x的日志记录API更改来实现类似的好处。

下一个代码清单演示了记录长时间运行的操作。 第一个示例在名称为“ slow”的实例上隐式调用toString()方法。 第二个日志记录示例调用了一个长时间运行的方法。

传统,无人值守的测井

// Will implicitly invoke slow's toString() method
logger.debug("NORMAL: " + slow);
// Will explicitly invoke the long-running method expensiveOperation()
logger.debug(expensiveOperation());

在前面的示例中,即使实际上未执行任何日志记录,这两个日志记录操作也将花费很长时间。 先前代码清单中的日志记录语句仅在日志记录级别为DEBUG或不太明确的日志级别(例如TRACE)时才实际记录,但是即使没有任何记录,它们的昂贵操作也将运行。

在Log4j 1.x中,有两种方法可以解决此问题。 一种方法(通常是最好的方法)是尝试重新编写log语句,以便不涉及长时间运行的操作 。 如果不切实际(例如,当需要与长时间运行的操作关联的上下文以使日志消息有用时),则可以使用日志保护。 接下来演示在Log4j 1.x中有效的这种方法。

传统的,受保护的日志记录

if (logger.isDebugEnabled())
{logger.debug("GUARDED: " + slow);logger.debug(expensiveOperation());
}

如上一代码清单所示,日志防护措施可以有效地防止调用长时间运行的操作,即使无论如何也不会记录任何消息。 但是,使用日志保护确实会带来一些缺点。 也许最主要的缺点是引入了额外的(有些人会说是code肿的)代码。 另一个潜在的缺点很少见,但更为严重:由于条件块和关联块引入了额外的作用域,因此更容易在条件块中引入错误代码,甚至有可能在依赖于日志记录级别的情况下带来副作用代码块。

最常见的情况之一是,日志调用实际上不会记录任何内容,但会显着影响性能,这是当将对象传递给logger调用或与传递给该字符串的字符串连接时,显式或隐式调用对象的toString()方法。记录器调用。 在上面的两个代码清单中,通过将字符串文字“ GUARDED:”与名为“ slow”的变量的隐式调用toString()方法进行连接,将字符串传递给logger调用,证明了这种情况。

SLF4J 普及了参数化日志记录调用的概念,Log4j 2在其日志记录API中提供了类似的支持 。 下面的代码演示了如何使用它。

参数化记录

logger.debug("PARAMETERIZED: {}", slow);
logger.debug("{}", expensiveOperation());

当上面的参数化日志记录示例以比DEBUG更特定的日志级别执行时,由于参数化日志记录,将不会尝试在“ slow”变量上使用隐式toString() 。 但是,参数化日志记录无法帮助其他日志记录情况,因为尽管进行了参数化日志记录,但仍将调用方法expensiveOperation() 。 还要注意,尽管参数化日志记录在隐式toString()调用的情况下有所帮助 ,但在显式toString()调用中却无济于事 。 即使日志记录级别比DEBUG更具体,在logger语句中对slow.toString()的调用仍会导致性能slow.toString()

Log4j 2.4引入了一种基于Lambda的机制 ,该机制可用于延迟对传递给logger调用的方法的调用,这样,如果该语句的记录级别低于当前日志级别,则根本不需要执行它们。 。 这表现在下一代码列表,其中toString()方法被明确地通过λ表达式称为“慢”变量的对象上,并且expensiveOperation方法是通过调用方法的参考 。

Lambda表达式记录

logger.debug("LAMBDA: ", () -> slow.toString());
logger.debug("{}", this::expensiveOperation);

当以上代码的日志级别设置为比DEBUG更具体的级别时,由于基于lambda表达式的延迟加载,因此不会调用“慢速”对象的toString()方法和expensiveOperation方法。 换句话说,类似于该示例与警卫一起使用的方式,使用lambda表达式可以防止不必要地执行可能长时间运行的方法,除非它们的结果要真正记录下来。 此lambda表达式支持已在2.4版本中添加到Log4j,并且当然需要Java 8 。

摘要

Log4j 2(2.4)提供了多种方法来避免在未实际记录消息时对日志语句的性能造成影响。

  1. 可以重写日志语句,以便根本不记录昂贵的方法(包括昂贵的toString()调用)。
  2. 日志保护可以用来确保仅在实际记录消息时才执行log语句的长时间运行的方法调用。
  3. 除非确实记录了消息,否则Log4j 2的参数化(格式化)记录器API可用于消除对隐式toString()方法的调用。
  4. Log4j 2.4的lambda表达式记录器API可用于消除对已记录消息所需的任何操作(隐式或显式)的调用,除非已真正记录了该消息。

翻译自: https://www.javacodegeeks.com/2015/10/better-performing-non-logging-logger-calls-in-log4j2.html

log4j2 无日志记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA8如何进行IDEA配置_IntelliJ Idea 配置jdk8

环境: 环境变量JAVA_HOME配置jdk1.8idea配置支持lambda:File -> Project Structure -> Modules -> Language level, 选择: 8-Lambdas, type annotations etc.File -> Project Structure -> Project -> Project language level, 选择…

spring 占位符默认值_Spring中的值注释中的占位符支持

spring 占位符默认值Value批注中的${...}占位符用于访问在PropertySource注册的属性。 这对于Spring应用程序中的Configuration bean非常有用,但不仅如此。 为确保这是可能的, PropertySourcesPlaceholderConfigurer必须存在于所有需要占位符解析的应用程…

java用户名检查数据库_登入界面账号密码是访问数据库,但登入问题时if判断时就是执行不了...

回复 2楼 林月儿我按着你的方法试了下,可还是这个判断不能执行 if(password.equals(drmm.getText())){view.setText("登入成功");完整代码如下:import java.awt.*;import java.awt.event.*;import *;import *;import java.…

五皇后问题 java_Java的5个古怪问题

五皇后问题 java我们有机会接触到一些最奇怪的Java难题 即使是最有经验的Java开发人员,也会在这篇文章中发现令人困惑的问题。 或者至少是有趣的(绝对不公平)。 在经历了Java Deathmatch冒险之后,我们决定这次发布一系列不同的问…

java加密成固定长度_Java使用MD5加密,生成的密文长度只有31位

在使用MD5加密时,生成的密文长度只有31位,该怎么解决?代码如下:public static String toMd5(String str) {String re null;byte encrypt[];try {byte[] tem str.getBytes();MessageDigest md5 MessageDigest.getInstance("…

可以自定义模板的ide_将IDE检查应用于自定义Java批注

可以自定义模板的ideJ2SE 5中注释的引入改变了我们编写和处理Java的方式。 除了Java SE的预定义注释外 ,框架,IDE和工具包还引入了自己的自定义注释 。 Checker框架提供了一些示例,说明如何使用自定义批注在Java中增加类型安全性 。 在本文中…

java设置弹出框为模态_点击按钮弹出模态框的一系列操作代码实例

实现功能提交按钮功能:点击提交按钮的时候都会弹出模态框,但是有不同的状态:审核状态未通过:弹出未通过理由的input输入框,模态框中除了取消和确定按钮,新增确定并保存医院的按钮审核状态已通过&#xff1a…

spock框架_Spock VW:编写自定义的Spock框架扩展

spock框架Spock框架具有多个内置扩展 ,这些扩展支持许多核心功能,例如Ignore和Timeout批注。 但更重要的是,鼓励开发人员编写自己的扩展。 例如, SpringExtension很好地将Spock与Spring框架集成在一起。 编写自定义扩展没有很好的…

java log 断点_项目中常见的log日志调用

第一种用法:引用org.apache.commons.logging.Log。import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;private static final Log logger LogFactory.getLog(PolicyAppBizAction.class); //PolicyAppBizAction.class是自己定义…

侦听127.0.01_Spring 4.2中由注释驱动的事件侦听器

侦听127.0.01介绍 在应用程序内交换事件已成为许多应用程序中必不可少的部分,幸运的是,Spring为瞬态事件(*)提供了完整的基础结构。 最近对事务绑定事件的重构为我提供了一个借口,以在实践中检查Spring 4.2中引入的新的…

java中bpmn流程图_Java学习之BPMN知识以及Activiti的流程部署

BPMN的介绍Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。那什么是BP…

javaone_JavaOne 2015 –第二十版十大收获

javaone我们刚刚在旧金山有了JavaOne的第二十版。 这将是我自2004年以来第十二次参加不间断的系列活动。最大的教训是什么,可以揭示Java的未来。 模块化斗争 自从Java 2007首次提到模块以来,已经花费了将近9年的时间,或者说,直到…

java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份

Java项目中调用bat批处理配合使用BCP进行多用户数据的备份一、项目需求最近项目中需要对数据库(Sql Server系列数据库)进行备份。项目中的需求不是简单的整个数据库的备份,而是根据用户来备份,具体的备份策略如下:①系统为某一赛事管理类型的…

mycat和应用程序集成_企业应用程序集成简介

mycat和应用程序集成本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来,您将深入研究Spring Integration的基础知识,例如通道,转…

java中读取单个字符_如何使用Java中的Scanner类读取单个字符?

从Java 1.5开始引入Scanner类。此类接受File,InputStream,Path和String对象,使用正则表达式逐个令牌读取所有原始数据类型和String(从给定的源)令牌。默认情况下,空格被视为定界符(将数据分成令牌)。使用Scanner类读取字符Scanner…

java中的case1怎么说_Java Cas20ServiceTicketValidator類代碼示例

本文整理匯總了Java中org.jasig.cas.client.validation.Cas20ServiceTicketValidator類的典型用法代碼示例。如果您正苦於以下問題:Java Cas20ServiceTicketValidator類的具體用法?Java Cas20ServiceTicketValidator怎麽用?Java Cas20Service…

drill apache_使用Apache Drill深入研究当今的大数据

drill apache自2014年9月首次提供Beta版以来, Apache Drill一直在获得广泛的用户采用和社区动力。2015年5月发布了Drill的通用版本-Drill 1.0,此后大量客户在生产中部署和使用了Drill。 在这篇博客文章中,我将简要总结客户在Drill中发现非常宝…

akka 消息发送接收_Akka型演员:探索接收器模式

akka 消息发送接收在上一篇文章中,我们研究了Akka Typed提供的一些基本功能。 在本文和下一篇文章中,我们将更进一步地了解一些其他功能,并通过查看Akka Typed提供的两种不同模式来做到这一点:Receiver和Receptionist模式。 如果您…

scale和java比较_浅谈java中BigDecimal的equals与compareTo的区别

这两天在处理支付金额校验的时候出现了点问题,有个金额比较我用了BigDecimal的equals方法来比较两个金额是否相等,结果导致金额比较出现错误(比如3.0与3.00的比较等)。【注:以下所讲都是以sun jdk 1.4.2版本为例,其他版本实现未必…

activemq和jms_带有ActiveMQ和Maven的JMS Sender应用程序

activemq和jms我们已经看到了如何使用ActiveMQ和Maven创建JMS Receiver应用程序 。 让我们看看我们如何类似地创建JMS Sender应用程序 。 web.xml与创建接收器应用程序时使用的相同&#xff1a; <web-app xmlns"http://java.sun.com/xml/ns/javaee"xmlns:xsi&qu…