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相关推荐

  1. Java Logging之JUL系列——LogRecord

    上文提到过,LogRecord可以理解为是一个DTO,那么LogRecord里面到底存储了哪些数据呢?我们可以看一下LogRecord类中含有哪些get/set方法,get方法如下所示: Level ...

  2. java云同桌学习系列(十四)——JavaScript语言

    本博客java云同桌学习系列,旨在记录本人学习java的过程,并与大家分享,对于想学习java的同学,可以随着我的步伐一起进步,我希望这个系列能够鼓励大家一同与我学习java,成为"云同桌& ...

  3. java面试常考系列四

    转载自 java面试常考系列四 题目一 大O符号(big-O notation)的作用是什么?有哪些使用方法? 大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是性能在最坏的场景下有多么好 ...

  4. JAVA面试常考系列三

    转载自 JAVA面试常考系列三 题目一 什么是迭代器(Iterator)? 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址.迭 ...

  5. Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)

    转自: https://juejin.cn/post/6844903903130042376 文末有源代码,非常棒 摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十篇,本篇 ...

  6. java.logging的重定向?

    java.logging的重定向? 接着昨天的工作. 上面说要重定向java.util.logging.Logger的输出, 发现也不是不可能. package jmx;import java.uti ...

  7. Java logging整理

    为什么80%的码农都做不了架构师?>>>    常见的java logging System.out与System.err java.util.logging apache log4 ...

  8. Java秒杀系统实战系列~构建SpringBoot多模块项目

    摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...

  9. Java云同桌学习系列(十九)——Linux系统

    本博客java云同桌学习系列,旨在记录本人学习java的过程,并与大家分享,对于想学习java的同学,我希望这个系列能够鼓励大家一同与我学习java,成为"云同桌". 每月预计保持 ...

  10. java微信支付v3系列——6.微信支付查询订单API

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

最新文章

  1. P2P Device Discovery流程分析
  2. 一天狂揽2000+星,微软面向初学者ML课程来了,完全免费
  3. angular cli全局版本大于本地版本 把本地版本升级方式
  4. (PHP7内核剖析-3) 变量
  5. 产品分析之需求分析的六原则
  6. 关于关闭浏览器Session就丢失的讨论
  7. 使用 Redis的SETNX命令实现分布式锁
  8. JDK15已发布,快来看看有哪些值得期待的新功能!
  9. linux mv命令: 移动文件或文件改名
  10. 按键手机java下载_经典按键java手机游戏
  11. 测试技术-易用性测试
  12. linux中fdisk的参数,Linux fdisk命令参数及用法详解---Linux磁盘分区管理命令fdisk
  13. 台式计算机如何连接投影仪,台式机怎么接投影仪 台式机接投影仪方法【详解】...
  14. 光纤通道交换机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  15. 马斯克在 Clubhouse 上「开房」,讲创业、公司进展,还当了回记者
  16. KVM远程迁移启动报错
  17. java中已实现的md5加密
  18. Phobos Runtime Library
  19. 核心单词Word List 42
  20. 开发app需要什么技术?手机app制作方式、价格及性能盘点

热门文章

  1. 8.找出链表环的入口结点
  2. 依概率收敛与按分布收敛
  3. 自检zabbix健康脚本
  4. 指针式仪表自动识别和读数
  5. 利用watir自动化测试并截图,截图后保存
  6. HTML---基础篇
  7. 写给XJTU计算机系大一大二的童鞋
  8. 浅析eTS的起源和演进
  9. deepmind dnc 相关的软件下载资源
  10. c++中获取蓝图组件_C++和蓝图