带有Java Util日志记录的Java 8延迟调用

在博客文章“在Log4j2中更好地执行非日志记录器调用”中 ,我介绍了可以在Log4j 2中使用的方法,这些方法可以减少或避免在基于指定日志级别实际上根本未记录的日志语句中调用方法。 作为讨论的一部分,我介绍了Log4j 2对使用lambda表达式的基于Java 8的延迟执行的支持。 在本文中,我将演示如何使用内置的java.util.logging ( JUL )支持来使用lambda表达式延迟执行日志语句中的方法,其方式类似于Log4j 2所支持的方式。

java.util.logging.Logger类级别的Javadoc文档描述了JUL对延迟执行的支持:

一组方法也可以使用“ msgSupplier”而不是“ msg”参数。 这些方法需要供应商

该函数仅在基于有效日志级别实际记录消息时才调用以构造所需的日志消息,从而消除了不必要的消息构造。

浏览java.util.logging.Logger的公共API,可以快速浏览该注释中引用的方法,该方法使用供应商来允许推迟方法调用,直到真正知道需要进行日志为止。 接受内置功能接口 java.util.function.Supplier的实例作为参数的code.util.logging.Logger方法。 例如,下一个屏幕快照使用一些接受Supplier的方法来捕获HTML呈现的Javadoc的一小部分。

20160402-selectSupplierAcceptingJULLoggerLogMethods(1)

我喜欢使用javap轻松查看Java类的公共API。 在这种情况下,可以通过执行$JAVA_HOME/jre/lib目录javap -classpath rt.jar java.util.logging.Logger的命令javap -classpath rt.jar java.util.logging.Logger来完成此操作(假设已配置了JAVA_HOME环境变量)。 下一个屏幕快照描述了该命令的执行以及结果的第一部分。 屏幕快照之后是输出的文本版本, 强调Supplier的使用。

20160402-javapOnJULLoggerClass(1)

Compiled from "Logger.java"
public class java.util.logging.Logger {static final java.lang.String SYSTEM_LOGGER_RB_NAME;public static final java.lang.String GLOBAL_LOGGER_NAME;public static final java.util.logging.Logger global;static final boolean $assertionsDisabled;public static final java.util.logging.Logger getGlobal();protected java.util.logging.Logger(java.lang.String, java.lang.String);java.util.logging.Logger(java.lang.String, java.lang.String, java.lang.Class<?>, java.util.logging.LogManager, boolean);void setLogManager(java.util.logging.LogManager);public static java.util.logging.Logger getLogger(java.lang.String);public static java.util.logging.Logger getLogger(java.lang.String, java.lang.String);static java.util.logging.Logger getPlatformLogger(java.lang.String);public static java.util.logging.Logger getAnonymousLogger();public static java.util.logging.Logger getAnonymousLogger(java.lang.String);public java.util.ResourceBundle getResourceBundle();public java.lang.String getResourceBundleName();public void setFilter(java.util.logging.Filter) throws java.lang.SecurityException;public java.util.logging.Filter getFilter();public void log(java.util.logging.LogRecord);public void log(java.util.logging.Level, java.lang.String);public void log(java.util.logging.Level, java.util.function.Supplier<java.lang.String>);public void log(java.util.logging.Level, java.lang.String, java.lang.Object);public void log(java.util.logging.Level, java.lang.String, java.lang.Object[]);public void log(java.util.logging.Level, java.lang.String, java.lang.Throwable);public void log(java.util.logging.Level, java.lang.Throwable, java.util.function.Supplier<java.lang.String>);public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String);public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.util.function.Supplier<java.lang.String>);public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.Object);public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.Object[]);public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.Throwable);public void logp(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.Throwable, java.util.function.Supplier<java.lang.String>);public void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.String);public void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Object);public void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Object[]);public void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.util.ResourceBundle, java.lang.String, java.lang.Object...);public void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Throwable);public void logrb(java.util.logging.Level, java.lang.String, java.lang.String, java.util.ResourceBundle, java.lang.String, java.lang.Throwable);public void entering(java.lang.String, java.lang.String);public void entering(java.lang.String, java.lang.String, java.lang.Object);public void entering(java.lang.String, java.lang.String, java.lang.Object[]);public void exiting(java.lang.String, java.lang.String);public void exiting(java.lang.String, java.lang.String, java.lang.Object);public void throwing(java.lang.String, java.lang.String, java.lang.Throwable);public void severe(java.lang.String);public void warning(java.lang.String);public void info(java.lang.String);public void config(java.lang.String);public void fine(java.lang.String);public void finer(java.lang.String);public void finest(java.lang.String);public void severe(java.util.function.Supplier<java.lang.String>);public void warning(java.util.function.Supplier<java.lang.String>);public void info(java.util.function.Supplier<java.lang.String>);public void config(java.util.function.Supplier<java.lang.String>);public void fine(java.util.function.Supplier<java.lang.String>);public void finer(java.util.function.Supplier<java.lang.String>);public void finest(java.util.function.Supplier<java.lang.String>);public void setLevel(java.util.logging.Level) throws java.lang.SecurityException;final boolean isLevelInitialized();public java.util.logging.Level getLevel();public boolean isLoggable(java.util.logging.Level);public java.lang.String getName();public void addHandler(java.util.logging.Handler) throws java.lang.SecurityException;public void removeHandler(java.util.logging.Handler) throws java.lang.SecurityException;public java.util.logging.Handler[] getHandlers();java.util.logging.Handler[] accessCheckedHandlers();public void setUseParentHandlers(boolean);public boolean getUseParentHandlers();public void setResourceBundle(java.util.ResourceBundle);public java.util.logging.Logger getParent();public void setParent(java.util.logging.Logger);final void removeChildLogger(java.util.logging.LogManager$LoggerWeakRef);static java.util.logging.Logger$LoggerBundle access$000();static java.util.logging.Logger$LoggerBundle access$100();static {};
}

java.util.logging.Logger的公共API可以看出,有很多重载的方法用于“精确日志记录”(接受显式指定的类和方法名称的两个Stringlogp方法)以及用于接受实例的“常规日志记录” Supplier 。 这些方法仅在将日志记录级别设置为足以写入日志语句的特定级别时,才可以处理供应商。

以下是接受Supplier实例的当前java.util.logging.Logger方法的列表:

  • 常规的特定级别的日志记录方法
    • public void severe (java.util.function.Supplier<java.lang.String>);
  • 需要规范日志级别的常规常规日志记录方法
    • public void log (java.util.logging.Level, java.util.function.Supplier<java.lang.String>);
  • “精确”的记录方法
    • public void logp (java.util.logging.Level, java.lang.String, java.lang.String, java.util.function.Supplier<java.lang.String>);

请记住,精确的日志记录方法(名称为logp )接受其类和方法名称的String参数,可以观察到JUL的延迟调用日志记录API与Log4j 2的实现之间的最大区别之一:JUL的实现不允许“消息”字符串,作为其日志记录方法的单独(附加)参数提供。

在我以前的博客文章中 ,我演示了Log4j 2的org.apache.logging.log4j.Logger.debug(String message,Supplier <?> ... paramSuppliers)方法的使用,该方法除了延迟执行提供的Supplier之外还接受消息String 。 。 Log4j 2的org.apache.logging.log4j.Logger提供了类似的方法来处理其他特定的日志级别( 错误 , 致命 , 信息 , 跟踪和警告 )以及具有明确级别的日志级别的常规日志记录。 通过与Supplier分开的String轻松提供上下文的额外灵活性是一个不错的选择。 还值得注意的是, Log4j 2的Logger还支持类似于java.util.logging.Logger提供的方法的各种日志方法,这些方法仅接受Supplier (没有任何上下文消息String )。

John Shepard在博客文章尝试Java 8的五大理由中写道:“现在可以从方法, log.isLogLevelEnabled和类似的方法中传递函数(并返回)了,不再需要在代码库中log.isLogLevelEnabled 。” 然后,他提供了一个简单的代码清单,演示了当消息上下文的单个String参数不属于方法签名的情况时,如何通过此API提供String上下文。 我在本文结尾处的示例将与此类似。

正如我在“在Log4j2中更好地执行非日志记录器调用”一文中所讨论的那样 ,由Java lambda表达式提供支持的延迟执行允许开发人员通过将传入对象的隐式和显式方法调用都推迟到lambda表达式被执行之前,从代码中删除日志保护。解决。 如果运行软件的日志记录级别的特定性低于消息的特定日志级别,则永远不会执行此操作。 换句话说,可以从下一个显示的代码清单转换代码,就像其后的较小代码清单一样。

if (logger.isLoggable(Level.FINE))
{logger.fine("GUARDED: " + slow);
}
if (logger.isLoggable(Level.FINE))
{logger.fine(expensiveOperation());
}
logger.fine(() -> "LAMBDA: " + slow);
logger.fine(this::expensiveOperation);

尽管软件开发中的许多事情实际上都是品味和见解的问题,但很难想象有很多理由支持较早的,更冗长的代码。 尽管有一些断言,但是更少的代码并不总是对每个人都可读。 但是,在这种情况下,我相信很少有开发人员会争辩说,更冗长的代码无论如何都比Java 8版本更好。

翻译自: https://www.javacodegeeks.com/2016/04/java-8-deferred-invocation-java-util-logging.html

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

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

相关文章

python对象分类

1 python对象分类 所有的Python对象都拥有三个特性&#xff1a;身份&#xff0c;类型和值 身份&#xff1a; 每一个对象都有一个唯一的身份标识自己。任何对象的身份可以使用内建函数id()来得到。这个值可以被认为是该对象的内存地址类型&#xff1a; 对象的类型决定了对象可以…

怎样用u盘linux安装ntp协议,电脑中怎么配置NTP服务

NTP服务器是用来使计算机时间同步化的一种协议&#xff0c;可提供高精准度的时间校正&#xff0c;而且能通过加密确认来防止恶毒的协议攻击。下面让学习啦小编为大家介绍如何在电脑中配置NTP服务来实现局域网内设备的时间同步。电脑中怎么配置NTP服务1、先关闭Windows系统自带的…

SetGID 权限

一、SetGID针对文件的作用 1、只有可执行的二进制程序才能设置SGID权限 2、命令执行者要对该程序拥有 x &#xff08;执行&#xff09;权限 3、命令执行在执行程序的时候&#xff0c;组身份升级为该程序的属组 4、SetGID权限同样只在该程序执行过程中有效&#xff0c;也就是说组…

nosql的数据服务_使用NoSQL实现实体服务–第2部分:合同优先

nosql的数据服务现在该开始使用NoSQL项目对SOA实体服务进行编码了&#xff0c;并且正如我所承诺的&#xff0c;我将从Web服务的合同开始。 看一下本系列的第1部分 。 这种从Web服务合同定义开始的技术是面向服务的体系结构实现的“合同优先”方法的核心&#xff0c;并具有许多技…

weblogic双机热备部署linux,WebLogic应用在集群环境下的一些基本知识【转载】

4.2.1 基本概念1&#xff0e;硬件的cluster和WebLogic的cluster不是一回事&#xff0c;硬件做的是冷备份&#xff0c;对用户的session&#xff0c;用户请求的负载均衡等的处理是做不到 的&#xff0c;而且一般硬件的双机热备也不是时时的备份&#xff0c;而是间隔一段时间再将主…

vmware中centos6.4突然无法进入图形界面解决方法

今天遇到vmvare中centos6.4进度条走完了仍然没有进入图形界面&#xff0c;在网上找到了解决方法记录如下&#xff1a; 1. 按CtrlAltF5并输入root账号密码进入命令界面 2. vim /etc/inittab 打开/etc/inittab文件&#xff0c;并将文件最后id:5改为id:3&#xff0c;即将运行等级…

教程:正确的SLF4J日志记录用法以及如何检查它

SLF4J是一个非常流行的日志记录外观&#xff0c;但是&#xff0c;就像我们使用的所有库一样&#xff0c;我们有可能以错误的方式或至少以非最佳方式使用它。 在本教程中&#xff0c;我们将列出常见的日志记录错误以及如何使用FindBugs检测到它们。 我们还将在相关时提及PMD和S…

linux逐行扫描,FFmpeg怎么区分识别视频是逐行扫描还是隔行扫描

最近遇到要识别隔行扫描的视频加以特殊转码处理的问题。google了一番以后找到两个解决的方式&#xff0c;记录一下。方法一&#xff1a;使用隔行扫描检查滤镜idet区分隔行扫描和逐行扫描ffmpeg -filter:v idet \ -frames:v 100 \ -an \ -f rawvideo -y /dev/null \ -i 351.mp4 …

JDBC学习笔记 day1

JDBC的基本概念&#xff1a; JDBC就是java database connectivity&#xff0c;即java数据库连接。 JDBC主要完成的几个任务分别为 与数据库建立一个连接  向数据库发送SQL语句  处理数据库返回的结果JDBC的作用&#xff1a; 将java程序语言编写出来的程序&#xff0c;与数据…

稀疏矩阵的转置c语言程序,程序有问题求大神,稀疏矩阵转置

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #define N 100typedef int DataType;typedef struct{int i,j;DataType v;}TriTupleNode;typedef struct{TriTupleNode data[N];int m,n;int t;}TriTupleTable;void TransMatrix(TriTupleTable *b,TriTupleTable *a);void …

jsf组件不显示_JSF组件库–质量不只是零缺陷

jsf组件不显示自从我上次查看三个主要JSF组件库的质量以来已经有一段时间了。 在2009年12月&#xff0c;我开始比较RichFaces&#xff0c;Primefaces和ICEfaces的整体软件质量 。 从那时起&#xff0c;事情发生了变化&#xff0c;从现在开始&#xff0c;我想重新评估和更新它。…

linux安装mysql(shell一键安装)

1. 相关文件&#xff08;install_mysql.sh、my.cnf、mysqld相关内容在文中最后面&#xff09; 2. 将上面的文件上传到linux服务器某一目录下 3.给install_mysql.sh赋执行权限 # chmod x instll_mysql.sj 4. 执行install_mysql.sh # ./install_mysql.sh 5. 验证 6. install_mysq…

c语言编译时检查逻辑错误吗,C语言陷阱与技巧20节,自定义“编译时”assert方法,在代码编译阶段检查“逻辑”错误...

在C语言程序开发中&#xff0c;程序员写代码时应该考虑的“面面俱到”&#xff0c;这样才能写出功能稳定的程序。例如&#xff0c;在实现 open() 函数时&#xff0c;先完成它的功能固然是重要的&#xff0c;但是程序员还需要考虑各种“意外”&#xff0c;比如下面这种情况。假设…

springboot 多个sevice类实现同一接口的调用

参考页面&#xff1a;http://blog.csdn.net/xiao190128/article/details/54890759/&#xff1b;感谢分享 service 是有用的相当于 xml配置中得bean id service 也可以不指定 不指定相当于 bean id com. service.service 就是这个类的全限定名,表示给当前类命名一个别名&a…

影场与属性访问器界面

卡尔迪亚&#xff08;Carl Dea&#xff09;最近跟踪了我的一篇名为“ 保存内存”的博客文章&#xff01; 为属性使用阴影字段 。 在他的博客中&#xff0c;他建议使用一个称为“属性访问器”的接口来消除使用阴影字段所需的大量样板代码。 卡尔还提到他尚未用大量数据测试他的方…

[ZJOI2012]数列

超级水的题还wa了一次 首先很容易发现其实就只有两个值并存 然后 要注意把数组初始化啊。。。可能后面有多余的元素&#xff08;对拍的时候由于从小到大就没跑出错&#xff09; #include <bits/stdc.h> using namespace std; int a[170],b[170],a1[170],a2[170],x1[170],…

在c语言中,可以使用动态内存分配技术定义元素个数可变的数组,C语言复制在线考题1精选.doc...

C语言复制在线考题1精选窗体顶端《C语言程序设计208304》综合测试返回测验列表大项 1 / 2 - 单项选择题60.0/ 70.0 分本大题共35道&#xff0c;每题2分&#xff0c;共计70分&#xff0c;答错、不答均不得分。题目 1 / 552.0/ 2.0 分有字符数组 a[80]和 b[80]&#xff0c;则正确…

信管家源代码c语言,用队列实现按层次创建二叉树的源代码,最好是C语言

满意答案Dcool2016.08.27采纳率&#xff1a;58% 等级&#xff1a;9已帮助&#xff1a;416人队列&#xff1f;&#xff1f;你每输入一个节点将其存入队列中&#xff0c;再输入它的左孩子&#xff0c;它的左孩子也会入队&#xff0c;我们取的时候应先取该节点的左孩子&#xf…

jboss4 java_JBoss核心Java Web服务

jboss4 java这篇博客文章涉及Web服务。 好吧&#xff0c;更确切地说&#xff0c;它处理JBoss上的“普通” java Web服务。 这意味着我们将创建一个没有任何其他框架&#xff08;例如CXF&#xff0c;Axis等&#xff09;的Web服务。 JBoss它自己提供对Web服务的支持。 因此&#…

Java中的注解是如何工作的?

自Java5.0版本引入注解之后&#xff0c;它就成为了Java平台中非常重要的一部分。开发过程中&#xff0c;我们也时常在应用代码中会看到诸如Override&#xff0c;Deprecated这样的注解。这篇文章中&#xff0c;我将向大家讲述到底什么是注解&#xff0c;为什么要引入注解&#x…