带有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;也就是说组…

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;比如下面这种情况。假设…

影场与属性访问器界面

卡尔迪亚&#xff08;Carl Dea&#xff09;最近跟踪了我的一篇名为“ 保存内存”的博客文章&#xff01; 为属性使用阴影字段 。 在他的博客中&#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…

android 广告弹出层,安卓广告活动弹窗控件 android-adDialog

软件介绍android-adDialog&#xff0c;一个简单、强大的广告活动弹窗控件。显示一个默认广告弹窗&#xff0c;支持单广告活动、多广告活动&#xff0c;当弹窗显示多广告是默认显示底部小圆圈&#xff0c;当显示单活动时默认不显示底部小圆圈&#xff1b;默认支持弹窗从上&#…

(企业 / 公司项目)如何使用分布式任务调度框架Quartz集成 和 SpringBoot自带的定时任务集成?

SpringBoot自带的定时任务 首先在你的微服务项目中创建一个新的模块&#xff0c;定时调度模块 pom.xml里面关联公共模块common的依赖其他不需要改变 然后启动类别删&#xff0c;启动项目是否报错&#xff0c;写一个简单的测试类访问路径是否成功 package com.jiawa.train.bat…

在Spring中配置多个View解析器

1.简介 在Spring中&#xff0c;提供了View Resolver来使用模型中可用的数据来解析视图&#xff0c;而无需与JSP&#xff0c;Velocity或Thymeleaf等View技术紧密绑定。 Spring可以根据需要轻松灵活地配置一个或多个View Resolver 。 2. Spring MVC应用程序流程 在继续理解多个V…

android 知识体系

转载于:https://www.cnblogs.com/mamamia/p/8567570.html

android电视root权限获取,电视盒子/ 智能电视如何通过ADB获取ROOT权限?

如何通过adb获取root权限(安卓电视盒和智能电视通用)?Android 系统rom里面最主要的就3个文件&#xff1a;boot.img、system.img、userdata.img其中boot.img 存放着内核以及Android系统的配置信息&#xff0c;比如android系统各文件夹的读写权限&#xff0c;adb 的权限。所以如…

确定活动的热点垃圾收集器

StackOverflow问题查找正在运行哪种类型的垃圾收集 器&#xff0c;jvm的默认垃圾收集器 &#xff0c; 如何通过查看gc日志来查看正在运行的垃圾收集器&#xff1f; &#xff0c;以及如何知道HotSpot jvm的当前GC策略&#xff1f; 和博客文章如何以编程方式获取GC信息表明了人们…

app store 关键词

如何选取关键字&#xff0c;让你的应用关键词越来越多&#xff1f; 很多朋友在做应用商店优化的时候&#xff0c;都会遇到一个让人很头疼的问题&#xff1a;如何选取关键词&#xff1f;关键词的质量直接关系到App的自然下载量&#xff0c;所以&#xff0c;我们应该用科学的办法…

android 调用微信语音识别,Android 仿微信语音识别

参考于&#xff1a;Android模仿微信语音聊天功能&#xff0c;这代码跑起来有问题&#xff0c;自己改动了一下&#xff0c;基本上没什么大问题先贴下效果图1、三个布局文件activity_main.xmldialog_manger.xmlitem_layout2.自定义的类(1)DialogMangerpackage com.nickming.view;…

老罗android oat,入门ART虚拟机(5)——OAT文件

Android安全交流群&#xff1a;478084054先贴老罗的一张图&#xff1a;再摘一段老罗的描述&#xff1a;“作为Android私有的一种ELF文件&#xff0c;OAT文件包含有两个特殊的段oatdata和oatexec&#xff0c;前者包含有用来生成本地机器指令的dex文件内容&#xff0c;后者包含生…

Dajngo-Xadmin 修改菜单摆放排序

问题: Xadmin 默认是读取了所有被注册到 xadmin 的模型生成对应的菜单!这个是没问题的 ,但是xadmin又对菜单做了 "通过菜单名称" 排序.英文状态下我们的排列至少是 a-z排列的,但是一到中文就乱了,完全不符合我们的要求. 解决办法: 要到达按照我们 在 django 的 setti…