“JUL”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
 
(未显示同一用户的21个中间版本)
第1行: 第1行:
https://www.bilibili.com/video/BV1iJ411H74S/?p=4
+
[[JUL 入门]]
  
JUL 全称 Java Util Logging,是 Java 原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框架使用方便,学习简单,能够在小型应用中灵活使用。
+
[[JUL 日志级别]]
  
=== JUL 入门 ===
+
[[JUL 硬编码配置]]
  
 +
[[JUL Logger 对象父子关系]]
  
==== 架构介绍 ====
+
[[JUL 配置文件入门]]
[[文件:JUL架构图示.png|无|缩略图|813x813像素]]
 
  
* Loggers:被称为记录器,应用程序通过获取 Logger 对象,调用其 API 来发布日志消息。Logger 通常是应用程序访问日志系统的入口程序。
+
[[JUL 配置文件详解]]
* Appenders:也被称为 Handlers,每个 Logger 都会关联一组 Handlers,Logger 会将日志交给关联 Handlers 处理,由 Handlers 负责将日志做记录。Handlers 在此是一个抽象,其具体的实现决定了日志记录的位置可以是控制台、文件、网络上的其他日志服务或操作系统日志等。
 
* Layouts:也被称为 Formatters,它负责对日志事件中的数据进行转换和格式化。Layouts 决定了数据在一条日志记录中的最终形式。
 
* Level:每条日志消息都有一个关联的日志级别。该级别粗略指导了日志消息的重要性和紧迫,可以将 Level 和 Loggers,Appenders 做关联以便于我们过滤消息。
 
* Filters:过滤器,根据需要定制哪些信息会被记录,哪些信息会被放过。
 
总结一下就是:
 
  
用户使用 Logger 来进行日志记录,Logger 持有若干个 Handler,日志的输出操作是由 Handler 完成的。
+
[[JUL 执行原理和流程]]
  
Handler 在输出日志前,会经过 Filter 的过滤,判断哪些日志级别过滤放行、哪些拦截,
+
https://github.com/jihch/jul-demo
 
 
Handler 会将日志内容输出到指定位置(日志文件、控制台等)。
 
 
 
Handler 在输出日志时会使用 Layout,对输出内容进行排版。
 
 
 
 
 
 
 
 
 
==== 入门案例 ====
 
<syntaxhighlight lang="java">
 
package io.github.jihch.log;
 
 
 
import org.junit.Test;
 
 
 
import java.util.logging.Level;
 
import java.util.logging.Logger;
 
 
 
public class JULTest {
 
 
 
    @Test
 
    public void testQuick() {
 
 
 
        //1、创建日志记录器对象
 
        Logger logger = Logger.getLogger("io.github.jihch.log.JULTest");
 
 
 
        //2、日志记录输出
 
        logger.info("hello jul");
 
 
 
        logger.log(Level.INFO, "info msg");
 
 
 
        String name = "jack";
 
 
 
        Integer age = 18;
 
 
 
        logger.log(Level.INFO, "用户信息:{0},{1}", new Object[]{name, age});
 
 
 
    }
 
 
 
}
 
 
 
</syntaxhighlight><syntaxhighlight lang="console">
 
二月 21, 2023 8:33:03 下午 io.github.jihch.JULTest testQuick
 
信息: hello jul
 
二月 21, 2023 8:33:03 下午 io.github.jihch.JULTest testQuick
 
信息: info msg
 
二月 21, 2023 8:33:03 下午 io.github.jihch.JULTest testQuick
 
信息: 用户信息:jack,18
 
</syntaxhighlight>
 
 
 
 
 
 
 
https://www.bilibili.com/video/BV1iJ411H74S?p=5
 
==== 日志级别 ====
 
{| class="wikitable"
 
|Integer.MAX_VALUE
 
|OFF
 
|关闭日志
 
|-
 
|1000
 
|SEVERE
 
|十分严重
 
|-
 
|900
 
|WARNING
 
|警告
 
|-
 
|800
 
|INFO
 
|信息
 
|-
 
|700
 
|CONFIG
 
|配置信息
 
|-
 
|500
 
|FINE
 
|跟踪信息
 
|-
 
|400
 
|FINER
 
|跟踪信息
 
|-
 
|300
 
|FINEST
 
|跟踪信息
 
|-
 
|Integer.MIN_VALUE
 
|ALL
 
|记录所有日志
 
|}
 
可以为每个 logger 对象设置一个日志级别,每个级别都对应一个 int 值,大于等于这个值的日志就会被记录,小于这个值的日志就不会被记录
 
比如在一个类中,JULTest 中设置 logger 对象的日志级别是 OFF:<syntaxhighlight lang="java">
 
    public void testQuick() {
 
 
 
        //1、创建日志记录器对象
 
        Logger logger = Logger.getLogger("io.github.jihch.JULTest");
 
 
 
        logger.setLevel(Level.OFF);
 
 
 
        //2、日志记录输出
 
        logger.info("hello jul");
 
 
 
        // 通用方法进行日志记录
 
        logger.log(Level.INFO, "info msg");
 
 
 
 
 
        // 通过占位符 方式输出变量值
 
        String name = "jack";
 
        Integer age = 18;
 
        logger.log(Level.INFO, "用户信息:{0},{1}", new Object[]{name, age});
 
 
 
    }
 
</syntaxhighlight>
 
运行程序发现控制台没有日志记录输出
 
 
 
 
 
 
 
 
 
 
 
==== 测试默认日志级别 ====
 
<syntaxhighlight lang="java">
 
    // 日志级别
 
    @Test
 
    public void testLogLevel() {
 
        //1、获取日志记录器对象
 
        Logger logger = Logger.getLogger("io.github.jihch.JULTest");
 
 
 
        //2、日志记录输出
 
        logger.severe("severe");
 
        logger.warning("warning");
 
        logger.info("info");
 
        logger.config("config");
 
        logger.fine("fine");
 
        logger.finer("finer");
 
        logger.finest("finest");
 
 
 
    }
 
</syntaxhighlight><syntaxhighlight lang="console">
 
二月 21, 2023 8:40:42 下午 io.github.jihch.JULTest testLogLevel
 
严重: severe
 
二月 21, 2023 8:40:42 下午 io.github.jihch.JULTest testLogLevel
 
警告: warning
 
二月 21, 2023 8:40:42 下午 io.github.jihch.JULTest testLogLevel
 
信息: info
 
</syntaxhighlight>
 
 
 
说明 JUL 默认的日志级别是 info
 
 
 
 
 
 
 
 
 
https://www.bilibili.com/video/BV1iJ411H74S?p=6
 
 
 
==== 硬编码配置 ====
 
 
 
===== 尝试1 =====
 
<syntaxhighlight lang="java">
 
    // 日志级别
 
    @Test
 
    public void testLogConfig() {
 
        //1、获取日志记录器对象
 
        Logger logger = Logger.getLogger("io.github.jihch.JULTest");
 
 
 
        // 关闭系统默认配置
 
        logger.setUseParentHandlers(false);
 
 
 
        // 创建 ConsolHandler
 
        ConsoleHandler consoleHandler = new ConsoleHandler();
 
 
 
        // 创建简单格式
 
        SimpleFormatter simpleFormatter = new SimpleFormatter();
 
 
 
        // 进行关联
 
        consoleHandler.setFormatter(simpleFormatter);
 
        logger.addHandler(consoleHandler);
 
 
 
        // 配置日志具体级别
 
        logger.setLevel(Level.ALL);
 
        consoleHandler.setLevel(Level.ALL);
 
 
 
        //2、日志记录输出
 
        logger.severe("severe");
 
        logger.warning("warning");
 
        logger.info("info");
 
        logger.config("config");
 
        logger.fine("fine");
 
        logger.finer("finer");
 
        logger.finest("finest");
 
 
 
    }
 
</syntaxhighlight><syntaxhighlight lang="console">
 
二月 21, 2023 8:55:14 下午 io.github.jihch.JULTest testLogConfig
 
严重: severe
 
二月 21, 2023 8:55:14 下午 io.github.jihch.JULTest testLogConfig
 
警告: warning
 
二月 21, 2023 8:55:14 下午 io.github.jihch.JULTest testLogConfig
 
信息: info
 
二月 21, 2023 8:55:14 下午 io.github.jihch.JULTest testLogConfig
 
配置: config
 
二月 21, 2023 8:55:14 下午 io.github.jihch.JULTest testLogConfig
 
详细: fine
 
二月 21, 2023 8:55:14 下午 io.github.jihch.JULTest testLogConfig
 
较详细: finer
 
二月 21, 2023 8:55:14 下午 io.github.jihch.JULTest testLogConfig
 
非常详细: finest
 
</syntaxhighlight>
 
 
 
 
 
 
 
 
 
 
 
===== 尝试2 =====
 
<syntaxhighlight lang="java">
 
    // 日志级别
 
    @Test
 
    public void testLogConfig() throws IOException {
 
        //1、获取日志记录器对象
 
        Logger logger = Logger.getLogger("io.github.jihch.JULTest");
 
 
 
        // 关闭系统默认配置
 
        logger.setUseParentHandlers(false);
 
 
 
        // 创建 ConsolHandler 控制台输出
 
        ConsoleHandler consoleHandler = new ConsoleHandler();
 
 
 
        // 创建简单格式
 
        SimpleFormatter simpleFormatter = new SimpleFormatter();
 
 
 
        // 进行关联
 
        consoleHandler.setFormatter(simpleFormatter);
 
        logger.addHandler(consoleHandler);
 
 
 
        // 配置日志具体级别
 
        logger.setLevel(Level.ALL);
 
        consoleHandler.setLevel(Level.ALL);
 
 
 
        // 场景 FileHandler 文件输出
 
        FileHandler fileHandler = new FileHandler("E:\\record\\2023\\2\\21\\jul.log");
 
 
 
        // 进行关联
 
        fileHandler.setFormatter(simpleFormatter);
 
        logger.addHandler(fileHandler);
 
 
 
 
 
        //2、日志记录输出
 
        logger.severe("severe");
 
        logger.warning("warning");
 
        logger.info("info");
 
        logger.config("config");
 
        logger.fine("fine");
 
        logger.finer("finer");
 
        logger.finest("finest");
 
 
 
    }
 
</syntaxhighlight>console:<syntaxhighlight lang="console">
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
严重: severe
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
警告: warning
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
信息: info
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
配置: config
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
详细: fine
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
较详细: finer
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
非常详细: finest
 
</syntaxhighlight>"E:\record\2023\2\21\jul.log"<syntaxhighlight lang="console">
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
严重: severe
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
警告: warning
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
信息: info
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
配置: config
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
详细: fine
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
较详细: finer
 
二月 21, 2023 9:06:53 下午 io.github.jihch.JULTest testLogConfig
 
非常详细: finest
 
 
 
</syntaxhighlight>
 
 
 
 
 
 
 
 
 
 
 
https://www.bilibili.com/video/BV1iJ411H74S?p=7
 
 
 
==== Logger 对象父子关系 ====
 
<syntaxhighlight lang="java">
 
    // Logger 对象父子关系
 
    @Test
 
    public void testLogParent() {
 
        Logger logger1 = Logger.getLogger("io.github.jihch");
 
        Logger logger2 = Logger.getLogger("io.github");
 
 
 
        // 测试
 
        System.out.println(logger1.getParent() == logger2);
 
 
 
        // 所有日志记录器的顶级父元素 LogManager$RootLogger,name ""
 
        System.out.printf("logger2.getParent():%s, logger2.getParent().getName():%s\n", logger2.getParent(),
 
                logger2.getParent().getName());
 
 
 
        // 关闭默认配置
 
        logger2.setUseParentHandlers(false);
 
 
 
        // 创建 ConsolHandler 控制台输出
 
        ConsoleHandler consoleHandler = new ConsoleHandler();
 
 
 
        // 创建简单格式
 
        SimpleFormatter simpleFormatter = new SimpleFormatter();
 
 
 
        // 进行关联
 
        consoleHandler.setFormatter(simpleFormatter);
 
        logger2.addHandler(consoleHandler);
 
 
 
        // 配置日志具体级别
 
        logger2.setLevel(Level.ALL);
 
        consoleHandler.setLevel(Level.ALL);
 
 
 
        logger1.severe("severe");
 
        logger1.warning("warning");
 
        logger1.info("info");
 
        logger1.config("config");
 
        logger1.fine("fine");
 
        logger1.finer("finer");
 
        logger1.finest("finest");
 
    }
 
</syntaxhighlight>子包默认继承父包;
 
 
 
不写默认继承 RootLogger
 
 
 
RootLogger 有默认的 Handler 和 Formatter
 
 
 
 
 
 
 
 
 
 
 
=== JUL 配置文件入门 ===
 
https://www.bilibili.com/video/BV1iJ411H74S?p=8
 
 
 
默认配置文件调用
 
 
 
Logger.getLogger(String name) ->
 
 
 
Logger.demandLogger(String name, String resourceBundleName, Class<?> caller) ->
 
 
 
LogManager.getLogManager() ->
 
 
 
manager.ensureLogManagerInitialized() ->
 
 
 
owner.readPrimordialConfiguration()->
 
 
 
readConfiguration()->
 
 
 
f = new File(f, "logging.properties")
 
 
 
I:\Java\jdk1.8.0_101\jre\lib\logging.properties
 

2023年2月23日 (四) 09:36的最新版本