• 1.JUL


    JUL

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

    架构介绍

    在这里插入图片描述

    • 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,将输出内容进 行排版。

    入门案例

        @Test
        public void testQuick() {
            Logger logger = Logger.getLogger("com.machoul.JulService");
            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});
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    日志的级别

    • jul中定义的日志级别
      • SEVERE(最高值)
      • WARNING
      • INFO(默认值)
      • CONFIG
      • FINE
      • FINER
      • FINEST(最低值)
    • 还有两个特殊的级别
      • OFF:可用来关闭日志记录
      • ALL:启用所有消息的日志记录
        @Test
        public void testLogLevel() {
            // 1.获取日志对象
            Logger logger = Logger.getLogger("com.machoul.JulService");
            // 2.日志记录输出
            logger.severe("severe");
            logger.warning("warning");
            logger.info("info");
            logger.config("config");
            logger.fine("fine");
            logger.finer("finer");
            logger.finest("finest");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    自定义日志的级别

    @Test
        public void testLogConfig() throws IOException {
            Logger logger = Logger.getLogger("com.machoul.JulService");
    
            //关闭系统默认配置
            logger.setUseParentHandlers(false);
            //创建handler对象
            ConsoleHandler consoleHandler = new ConsoleHandler();
            //创建formatter对象
            SimpleFormatter simpleFormatter = new SimpleFormatter();
            //进行关联
            consoleHandler.setFormatter(simpleFormatter);
            logger.addHandler(consoleHandler);
            //设置日志级别
            logger.setLevel(Level.ALL);
            consoleHandler.setLevel(Level.ALL);
    
            //输出到日志文件
            String filPath = "/Users/machoul/IdeaProjects/machoul-log-test/machoul-jul-test/log/jul.log";
            FileHandler fileHandler = new FileHandler(filPath);
            fileHandler.setFormatter(simpleFormatter);
            logger.addHandler(fileHandler);
    
            logger.severe("severe");
            logger.warning("warning");
            logger.info("info");
            logger.config("config");
            logger.fine("fine");
            logger.finer("finer");
            logger.finest("finest");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    logger之间的父子关系

    JUL中Logger之间存在父子关系,这种父子关系通过树状结构存储,JUL在初始化时会创建一个顶层 RootLogger作为所有Logger父Logger,存储上作为树状结构的根节点。并父子关系通过路径来关联。

     @Test
        public void testLogParent() {
            // 日志记录器对象父子关系
            Logger logger1 = Logger.getLogger("com.machoul.log");
            Logger logger2 = Logger.getLogger("com.machoul");
            System.out.println(logger1.getParent() == logger2);
            // 所有日志记录器对象的顶级父元素 class为java.util.logging.LogManager$RootLogger name为""
            System.out.println("logger2 parent:" + logger2.getParent() + ",name:" + logger2.getParent().getName());
    
            // 一、自定义日志级别
            // a.关闭系统默认配置
            logger2.setUseParentHandlers(false);
            // b.创建handler对象
            ConsoleHandler consoleHandler = new ConsoleHandler();
            // c.创建formatter对象
            SimpleFormatter simpleFormatter = new SimpleFormatter();
            // d.进行关联
            consoleHandler.setFormatter(simpleFormatter);
            logger2.addHandler(consoleHandler);
            // e.设置日志级别
            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");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    日志的配置文件

    默认配置文件路径$JAVAHOME\jre\lib\logging.properties

        @Test
        public void testProperties() throws IOException {
            // 读取自定义配置文件
            InputStream in = JulService.class.getClassLoader().getResourceAsStream("logging.properties"); // 获取日志管理器对象
            LogManager logManager = LogManager.getLogManager();
            // 通过日志管理器加载配置文件
            logManager.readConfiguration(in);
            Logger logger = Logger.getLogger("com.machoul.JulService");
            logger.severe("severe");
            logger.warning("warning");
            logger.info("info");
            logger.config("config");
            logger.fine("fine");
            logger.finer("finer");
            logger.finest("finest");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    配置文件

    ## RootLogger使用的处理器(获取时设置)
    handlers=java.util.logging.ConsoleHandler
    # RootLogger日志等级
    .level=INFO
    
    
    ## 自定义Logger
    com.machoul.handlers=java.util.logging.FileHandler
    # 自定义Logger日志等级
    com.machoul.level=INFO
    # 忽略父日志设置
    com.machoul.useParentHandlers=false
    
    ## 控制台处理器
    # 输出日志级别
    java.util.logging.ConsoleHandler.level=INFO
    # 输出日志格式
    java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
    
    
    ## 文件处理器
    # 输出日志级别
    java.util.logging.FileHandler.level=INFO
    # 输出日志格式
    java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
    # 输出日志文件路径
    java.util.logging.FileHandler.pattern=/Users/machoul/IdeaProjects/machoul-log-test/machoul-jul-test/log/jul.log
    
    
    # 输出日志文件限制大小(50000字节)
    java.util.logging.FileHandler.limit=50000
    # 输出日志文件限制个数
    java.util.logging.FileHandler.count=10
    # 输出日志文件 是否是追加
    java.util.logging.FileHandler.append=true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    日志原理解析

    1. 初始化LogManagerLogManager
      1. 加载logging.properties配置
      2. 添加Logger到LogManager
    2. 从单例LogManager获取Logger
    3. 设置级别Level,并指定日志记录LogRecord
    4. Filter提供了日志级别之外更细粒度的控制
    5. Handler是用来处理日志输出位置
    6. Formatter是用来格式化LogRecord的

    在这里插入图片描述

  • 相关阅读:
    安全检测风险
    一道简单题引发的思考
    【chatgpt&消费者偏好】是什么驱动了游客持续旅游意愿?推文分享—2024-07-08
    【数据结构】链表OJ题(建议收藏!!!)
    开源与闭源:驾驭大模型未来的关键决断
    【LeetCode】删除有序数组中的重复项、合并两个有序数组
    VTK--接口讲解之vtkLinearExtrusionFilter
    Web前端一套全部清晰 ① 学习路线
    TcpServerChannel 类服务
    【学习笔记】CF1784F Minimums or Medians
  • 原文地址:https://blog.csdn.net/qq_34932086/article/details/127637171