Java Logging之JUL系列——Log Levels
JDK自带的日志组件在java.util.logging包中,该组件将日志级别分为如下九种,级别从上到下依次降低,每种级别都对应一个整数值,如下所示:
- OFF(Integer.MAX_VALUE)
- SEVERE(1000)
- WARNING(900)
- INFO(800)
- CONFIG(700)
- FINE(500)
- FINER(400)
- FINEST(300)
- ALL(Integer.MIN_VALUE)
日志级别由java.util.logging.Level
类来表示,级别的作用是用来过滤日志输出的,除此之外,过滤器(Filter)也能起到对日志输出进行过滤的作用,我们后文再详细讨论Filter。
首先我们来看一下JUL组件最常见的用法:
package cn.codecrazy.study;import java.util.logging.Logger;public class JavaLogging {private static final Logger logger = Logger.getLogger(JavaLogging.class.getName());public static void main(String[] args) {logger.finest("This is a finest message");logger.finer("This is a finer message");logger.fine("This is a fine message");logger.config("This is a config message");logger.info("This is an info message");logger.warning("This is a warning message");logger.severe("This is a severe message");}
}
输出如下所示:
八月 08, 2018 9:36:08 下午 cn.codecrazy.study.JavaLogging main
信息: This is an info message
八月 08, 2018 9:36:08 下午 cn.codecrazy.study.JavaLogging main
警告: This is a warning message
八月 08, 2018 9:36:08 下午 cn.codecrazy.study.JavaLogging main
严重: This is a severe message
为什么只输出了info以及info级别以上的信息呢?
以logger.config("This is a config message")
方法为例,该方法内部调用的是logger.log(Level.CONFIG, "This is a config message")
方法,其他的方法同理,都是对Logger.log方法的一种封装,只不过不同的方法传入的日志级别不一样。Logger.log(Level level, String msg)
该方法的实际含义为:比较参数中传入的level和当前Logger对象的level级别,如果参数中传入的level级别高于或等于当前Logger对象的级别,则将message进行输出。底层调用的方法如下:
public void log(Level level, String msg) {if (!isLoggable(level)) {return;}LogRecord lr = new LogRecord(level, msg);doLog(lr);}
如果isLoggable方法返回false,则直接return.
public boolean isLoggable(Level level) {if (level.intValue() < levelValue || levelValue == offValue) {return false;}return true;}
如果当前logger对象的levelValue为offValue(即Level.OFF级别对应的整数)说明关闭了日志记录功能,不进行输出,或者是传入的日志级别比当前logger的level低,也不进行输出。换句话说就是日志记录器Logger只对级别高于或者等于它自身日志级别的信息进行输出。那么我们可以推测,当前的logger对象的日志级别默认应该就是INFO级别。
我们可以更改一下logger的级别为WARNING:
logger.setLevel(Level.WARNING);
输出如下:
八月 08, 2018 10:19:07 下午 cn.codecrazy.study.JavaLogging main
警告: This is a warning message
八月 08, 2018 10:19:07 下午 cn.codecrazy.study.JavaLogging main
严重: This is a severe message
这次只输出了WARNING以及SEVERE级别的日志信息。说明Level起到了过滤日志输出的作用。实际应用中,当我们调整日志级别的时候,相同的应用程序代码输出的日志会不同。
我们试着把日志级别设置为更低的CONFIG级别,根据我们前面的论述,最终的输出应该是输出CONFIG及其以上级别的日志信息,但实际的输出结果却是:
八月 08, 2018 9:36:08 下午 cn.codecrazy.study.JavaLogging main
信息: This is an info message
八月 08, 2018 9:36:08 下午 cn.codecrazy.study.JavaLogging main
警告: This is a warning message
八月 08, 2018 9:36:08 下午 cn.codecrazy.study.JavaLogging main
严重: This is a severe message
并没有输出CONFIG级别的日志,还是输出的INFO及其以上级别的日志。为什么会这样呢?这是因为不仅Logger有Level的概念,JUL中的另一组件Handler也有Level的概念,Logger对message的输出最终是通过Handler来进行实际操作的,在输出的过程中,Handler组件依然会判断当前需要输出的日志级别跟Handler自身的级别相比是高还是低,只有当前需要输出的日志级别高于或者等于Handler自身的日志级别才会进行输出。
在这里我们的Logger级别设置为了CONFIG,通过logger.config
方法进行输出时,当前需要输出的日志级别为CONFIG,该级别不小于Logger的日志级别,因此不会被过滤,但是该级别小于实际进行输出操作的Handler的级别(默认是INFO),因此不会被该Handler进行实际的输出操作。
关于Handler的详细信息会在后续文章中进行介绍。
Java Logging之JUL系列——Log Levels相关推荐
- Java Logging之JUL系列——LogRecord
上文提到过,LogRecord可以理解为是一个DTO,那么LogRecord里面到底存储了哪些数据呢?我们可以看一下LogRecord类中含有哪些get/set方法,get方法如下所示: Level ...
- java云同桌学习系列(十四)——JavaScript语言
本博客java云同桌学习系列,旨在记录本人学习java的过程,并与大家分享,对于想学习java的同学,可以随着我的步伐一起进步,我希望这个系列能够鼓励大家一同与我学习java,成为"云同桌& ...
- java面试常考系列四
转载自 java面试常考系列四 题目一 大O符号(big-O notation)的作用是什么?有哪些使用方法? 大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是性能在最坏的场景下有多么好 ...
- JAVA面试常考系列三
转载自 JAVA面试常考系列三 题目一 什么是迭代器(Iterator)? 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址.迭 ...
- Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)
转自: https://juejin.cn/post/6844903903130042376 文末有源代码,非常棒 摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十篇,本篇 ...
- java.logging的重定向?
java.logging的重定向? 接着昨天的工作. 上面说要重定向java.util.logging.Logger的输出, 发现也不是不可能. package jmx;import java.uti ...
- Java logging整理
为什么80%的码农都做不了架构师?>>> 常见的java logging System.out与System.err java.util.logging apache log4 ...
- Java秒杀系统实战系列~构建SpringBoot多模块项目
摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...
- Java云同桌学习系列(十九)——Linux系统
本博客java云同桌学习系列,旨在记录本人学习java的过程,并与大家分享,对于想学习java的同学,我希望这个系列能够鼓励大家一同与我学习java,成为"云同桌". 每月预计保持 ...
- java微信支付v3系列——6.微信支付查询订单API
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
最新文章
- P2P Device Discovery流程分析
- 一天狂揽2000+星,微软面向初学者ML课程来了,完全免费
- angular cli全局版本大于本地版本 把本地版本升级方式
- (PHP7内核剖析-3) 变量
- 产品分析之需求分析的六原则
- 关于关闭浏览器Session就丢失的讨论
- 使用 Redis的SETNX命令实现分布式锁
- JDK15已发布,快来看看有哪些值得期待的新功能!
- linux mv命令: 移动文件或文件改名
- 按键手机java下载_经典按键java手机游戏
- 测试技术-易用性测试
- linux中fdisk的参数,Linux fdisk命令参数及用法详解---Linux磁盘分区管理命令fdisk
- 台式计算机如何连接投影仪,台式机怎么接投影仪 台式机接投影仪方法【详解】...
- 光纤通道交换机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 马斯克在 Clubhouse 上「开房」,讲创业、公司进展,还当了回记者
- KVM远程迁移启动报错
- java中已实现的md5加密
- Phobos Runtime Library
- 核心单词Word List 42
- 开发app需要什么技术?手机app制作方式、价格及性能盘点