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

在JUL中有以下组件

  • Loggers:
    • 被称为记录器,应用程序通过获取Logger对象调用其API来来发布日志信息Logger 通常时应用程序访问日志系统的入口程序
  • Appenders//插件:
    • 也被称为Handlers,每个Logger都会关联一组Handlers,Logger会将日志交给关联 Handlers处理,由Handlers负责将日志做记录。Handlers在此是一个抽象,其具体的实现决定了 日志记录的位置可以是控制台、文件、网络上的其他日志服务或操作系统日志等。

Handler//处理器

  • Layouts:
    • 也被称为Formatters它负责对日志事件中的数据进行转换和格式化Layouts决定了 数据在一条日志记录中的最终形式
  • Level:
    • 每条日志消息都有一个关联的日志级别。该级别粗略指导了日志消息的重要性和紧迫,我 可以将Level和Loggers,Appenders做关联以便于我们过滤消息。
  • Filters:过滤器,根据需要定制哪些信息会被记录,哪些信息会被放过。

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

1. 入门案例

注意导包:java.util.logging.lpggerimage.png
仅打印在控制台, 因为还未指定文件 所以没有生成log文件
image.png

2. 日志的级别

JUL中定义的日志级别,从上述例子中我们也看到使用info和warning打印出的日志有不同的前缀,通过给日志设置不同的级别可以清晰的从日志中区分出哪些是基本信息,哪些是调试信息,哪些是严重的异常。
(1)java.util.logging.Level中定义了日志的级别:

  1. SEVERE(最高值) //严重
  2. WARNING //警告
  3. INFO (默认级别) //信息
  4. CONFIG
  5. FINE
  6. FINER
  7. FINEST(最低值)

    再例如:我们查看tomcat的日志,能明显的看到不同级别的日志,其实tomcat默认使用的就是JULimage-20211021112420933.acbc908d.png
    还有两个特殊的级别:

  • OFF,可用来关闭日志记录。
  • ALL,启用所有消息的日志记录。

虽然我们测试了7个日志级别

  1. public void testLogger() {
  2. Logger logger = Logger.getLogger(LoggerTest.class.getName());
  3. logger.severe("severe");
  4. logger.warning("warning");
  5. logger.info("info");
  6. logger.config("config");
  7. logger.fine("fine");
  8. logger.finer("finer");
  9. logger.finest("finest");
  10. }

我们发现能够打印的只有三行,这是为什么呢?
image.png
我们找一下这个文件
因为JUL是java原生日志框架 在javaJDK中自带 所以要去JDK文件中的配置文件去找image.pngimage.png
这样改会影响到所有用到jdk的程序 所有我们需要一个项目有一个专属的日志配置文件
所以要把此文件复制一份出来 用流定位的方式去读取 每一份项目程序自己去读取配置文件 不去修改jdk文件
但是我们可以简单的看看这个日志配置了哪些内容: image.png
在日志中我们发现了,貌似可以给这个日志对象添加各种handler就是处理器,比如ConsoleHandler专门处理控制台日志,FileHandler貌似可以处理文件,同时我们确实发现了他有这么一个方法: image-20211021114314901.e1fd4727.png