JUL日志框架的基本使用和运行流程

JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框架使用方便,学习简单,能够在小型应用中灵活使用。

在JUL中有以下组件:

  • Loggers:被称为记录器,应用程序通过获取Logger对象,调用其API来发布日志信息。Logger 通常时应用程序访问日志系统的入口程序。
  • Appenders:也被称为Handlers,每个Logger都会关联一组Handlers,Logger会将日志交给关联 Handlers处理,由Handlers负责将日志做记录。Handlers在此是一个抽象,其具体的实现决定了 日志记录的位置可以是控制台、文件、网络上的其他日志服务或操作系统日志等。
  • Layouts:也被称为Formatters,它负责对日志事件中的数据进行转换和格式化。Layouts决定了 数据在一条日志记录中的最终形式。
  • Level:每条日志消息都有一个关联的日志级别。该级别粗略指导了日志消息的重要性和紧迫,我 可以将Level和Loggers,Appenders做关联以便于我们过滤消息。
  • Filters:过滤器,根据需要定制哪些信息会被记录,哪些信息会被放过。

总结一下就是:

用户使用Logger来进行日志记录,Logger持有若干个Handler,日志的输出操作是由Handler完成的。 在Handler在输出日志前,会经过Filter的过滤,判断哪些日志级别过滤放行哪些拦截,Handler会将日志内容输出到指定位置(日志文件、控制台等)。Handler在输出日志时会使用Layout,将输出内容进行排版。

日志的级别

java.util.log.Level中定义了日志的级别,severe,warning,info,config,fine,finer,finest,off,all

@Test
public void testLogger() {Logger logger = Logger.getLogger(LoggerTest.class.getName());logger.severe("severe");logger.warning("warning");logger.info("info");logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");
}

发现只能打印出info及以上的日志,为什么呢?

我们调用是jdk提供的Logger,jdk会默认读取一个对应的配置文件logging.properties,在jdk1.8中这文件的位置是在jdk目录下/jre/lib/loggingproperties下,删除注释后我们可以看到配置文件是


handlers= java.util.logging.ConsoleHandler
.level= INFOjava.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatterjava.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

这里.level和consoleHandler的日志级别都是info,这导致上面的logger只能打印info及以上的信息。那么为什么是这样呢?

日志的继承关系

和装饰模式类似,logger实例上可以装载handler,filter,logger和handler都可以调整可打印的日志级别,打印日志时从logger再到handler再到filter。而logger类也存在继承关系,始祖类是根looger是.,不同包名代表不同的层次关系。如图,com下的logger继承根logger,study和learn继承com的logger,但是两者又相互独立。

有了以上知识,可以回头看配置文件,以空行作为分隔,第一部分是根logger的配置,配置handler是consoleHandler,和对应的日志级别,第二部分是filehandler的配置,现在没有被使用,第三部分是consoleHandler的配置,配置了日志级别和打印字符串模板类。consoleHandler是控制台打印的,因此我们看到的日志是在控制台上的,又由于.和consolerhandler的日志级别都是info,而使用的logger默认会继承. ,因此控制台只会打印info之上的信息。

logger的创建

logger是由LogManager实例调用不同的方法实现,源码如:

manager又是静态创建的,从这个方法的源码,我们可以看出是懒加载的单例

manager可以确保同一个类对应的logger只会被创建一次,使得logger也是单例,可以通过Logger.getLogger获取两次logger比较两者哈希值判断是否为同一个。

从上述知识明白manager负责管理logger,我们可以进入manager的初始化方法,观察到manager调用了

很明显这是一个读取配置的方法,其中又调用了readConfiguration(),该方法中如下部分读取了logging.properties,此部分完成操作是找到配置文件并且获取一个该文件的输入流,调用readConfigurataion读取流中的数据

读取流中的数据后,再通过反射创建所需要的配置类

自定义配置文件

知悉上述过程,我们便可以通过配置类自定义我们的根logger和其他logger,创建一份我们需要的配置文件,使用输入流读取该数据,再调用LogManager的readConfigurataion方法读取,再调用静态方法Logger.getLogger方法创建logger。

   @Testpublic void testConfig() throws IOException {LogManager manager = LogManager.getLogManager();InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("logging.properties");manager.readConfiguration(in);Logger logger = Logger.getLogger(TestJUL.class.getName());logger.info("info");logger.fine("fine");logger.finer("finer");}
/*
四月 07, 2022 12:49:46 下午 learn.log.TestJUL testConfig
信息: info
四月 07, 2022 12:49:46 下午 learn.log.TestJUL testConfig
详细: fine
*/

通过自定义方式创建自己所需要的logger

除去自定义配置文件我们也可以直接不使用默认流程而去使用,比如第一个例子,默认流程如下

 @Testpublic void testLogger() {Logger logger = Logger.getLogger("TestJUL.class.getName()");//注意,不设置这个值的化,默认会继承根logger,默认配置中就又一个consoleHandler,// 加下下面那个就有两个所以会打印日志两次logger.setUseParentHandlers(false);ConsoleHandler consoleHandler = new ConsoleHandler();SimpleFormatter simpleFormatter = new SimpleFormatter();consoleHandler.setFormatter(simpleFormatter);consoleHandler.setLevel(Level.INFO);logger.setLevel(Level.INFO);logger.addHandler(consoleHandler);logger.severe("severe");logger.warning("warning");logger.info("info");logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");}

同样的我们可以像配置文件修改对应的值,效果也一样。这里不再赘述。

此外,文本的格式话涉及一些format的转换符,这里也不赘述。需要使用时上网查询即可。

参考资料:https://www.bilibili.com/video/BV1434y1o73n

JUL日志框架的基本使用和运行流程相关推荐

  1. 【日志框架-笔记】JUL日志框架的介绍及其使用

    日志框架 JUL日志框架 入门程序 Logger直接的父子继承关系 Formatters 独立的配置文件进行编写日志 使用日志打印异常 学习日志无非就是为了四大目的: 问题诊断,调试程序: 错误定位, ...

  2. MyBatis框架学习DAY_01:概念/创建运行流程

    MyBatis框架 1. MyBatis框架的作用 2. 创建MyBatis项目 3. 连接数据库 4. 创建数据表 5. 插入数据 5.1. 定义抽象方法 5.2. 配置SQL语句 5.3. 获取自 ...

  3. 学习Java日志框架之——搞懂日志门面(JCL+SLF4J)

    文章目录 系列文章目录 一.什么是日志门面 1.门面模式(外观模式) 2.日志门面 二.了解JCL 1.JCL组件结构 2.JCL案例 (1)JCL默认实现 (2)导入log4j测试原有程序 三.SL ...

  4. Java日志框架 -- SLF4J日志门面(入门案例、SLF4J优点、SLF4J日志绑定、SL4J桥接旧的日志框架)

    1. SLF4J日志门面 JCL日志门面逐渐被淘汰了,因为他无法动态的扩展具体的日志实现框架. 简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Ja ...

  5. 日志框架(3) : 日志门面、JCL介绍、SLF4J介绍

    文章目录 日志门面 日志门面概述 门面模式(外观模式) 日志门面 常见的日志框架及日志门面 JCL简介 SLF4J SLF4J简介 SLF4J桥接技术 SLF4J特点 SLF4J集成日志实现(jul, ...

  6. 详细SpringBoot教程之日志框架

    写在前面 鉴于有人留言说想要学习SpringBoot相关的知识,我这里打算写一个SpringBoot系列的相关博文,目标呢是想让看了这一系列博文的同学呢,能够对SpringBoot略窥门径,这一系列的 ...

  7. 获取日志的等级_进阶之路:Java 日志框架全画传(中)

    导读:随着互联网和大数据的蓬勃发展,分布式日志系统以及日志分析系统得到了广泛地应用.目前,几乎在所有应用程序中,都会用到各种各样的日志框架来记录程序的运行信息.鉴于此,工程师十分有必要熟悉主流的日志记 ...

  8. java log4j logback jcl_进阶之路:Java 日志框架全画传(下)

    导读:随着互联网和大数据的蓬勃发展,分布式日志系统以及日志分析系统得到了广泛地应用.目前,几乎在所有应用程序中,都会用到各种各样的日志框架来记录程序的运行信息.鉴于此,工程师十分有必要熟悉主流的日志记 ...

  9. JCL源码使用日志框架源码查看

    查看源码:Log接口的4个实现类JDk13JDK14 正常java.util.loggingLog4j 我们集成的log4jSimple JCL自带实现类(1)查看Jdk14Logger证明里面使用的 ...

最新文章

  1. 吉林大学计算机维护与维修,吉林大学汽车维修工程考试知识点.doc
  2. Akka 接收消息超时的处理_Receive Timeout
  3. Visual Studio 2017中的编译器工具布局
  4. mysql 开发基础系列22 SQL Model(带迁移事项)
  5. 利用numpy生成各种波
  6. You have provided a value for the LANGUAGE_CODE setting that is not in the LANGUAGES setting
  7. 写个自己用的jdbc 简单框架
  8. 安卓udp发包工具_Sendip 命令行发包工具,支持IP、TCP、UDP等
  9. 2021李宏毅机器学习、深度学习笔记
  10. win10安装vc2015失败,尝试解决方案,目前有效
  11. 偏微分方程数值求解 -- ING
  12. android解压zap空间耗费,安卓zap抹机模块
  13. 美国地质勘探局官网(USGS)Landsat 8 OLI_TIRS 影像数据下载详解
  14. epub.js制作电子书阅读网站
  15. Python中的图形绘制——3D绘图
  16. HTTP 错误 404.5 - Not Found
  17. 误删的苹果电脑硬盘和数据库的数据怎么恢复
  18. .NET的那些事儿(9)——C# 2.0 中用iTextSharp制作PDF(基础篇) .
  19. java人民币大小写转换函数_java开发_数字转换汉语中人民币的大写_完整版
  20. 网络营销实验一 企业网站专业性诊断评价

热门文章

  1. burp爆破mysql_使用BurpSuite、Hydra和medusa爆破相关的服务
  2. mysql插入长度超长_JDBC插入数据超长时无法自动截断问题
  3. 基于ssm框架的校园订餐系统设计与实现 毕业设计-附源码270912
  4. Win10系统打开便利贴便签工具应用的多种方法
  5. Elektrobit(EB)官方试用版软件
  6. CMC-T型软起动器
  7. sim卡没坏但苹果手机无服务_手机卡无服务怎么恢复
  8. [linux]循序渐进学运维-基础命令篇-文件的归档和压缩
  9. Python数据处理工具 ——Pandas(数据的预处理)
  10. java实现逆波兰算法,【算法】逆波兰算法实现原理