【JAVA日志框架】JUL,JDK原生日志框架详解。

这篇具有很好参考价值的文章主要介绍了【JAVA日志框架】JUL,JDK原生日志框架详解。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Java日志体系混乱?Java日志框架系列,清晰简洁整理好整个Java的日志框架体系。第一篇,JDK原生日志框架——JUL。

【JAVA日志框架】JUL,JDK原生日志框架详解。,JAVA SE,java,jvm,开发语言,log4j

【JAVA日志框架】JUL,JDK原生日志框架详解。,JAVA SE,java,jvm,开发语言,log4j

目录

1.概述

2.日志级别

3.配置

4.继承关系


1.概述

日志框架的核心问题:

日志是用来记录应用的一些运行信息的。假设没有日志框架,我们要在应用里手动实现日志相关功能,我们需要关注些什么?其实仔细想想无非两点:

  • 记录哪些信息?

  • 记录到哪里去?

当然作为日志框架来说,为了方便使用,它还要关注一点就是:

  • 如何进行方便的配置

java日志体系中是先有的log4j,后面才有了JDK自带的jul,两者是两套体系,互不兼容。但其实本质上jul就是抄的log4j,其架构上都是一模一样的。以上三点核心问题,我们看作为日志框架的开山鼻祖的log4j是怎样解决的:

【JAVA日志框架】JUL,JDK原生日志框架详解。,JAVA SE,java,jvm,开发语言,log4j

log4j给出的答案是:

  • 记录哪些信息——日志级别(level)

  • 记录到哪里去——提供不同的输出方式(appender),文件、控制台、其它等等

  • 如何进行方便的配置——除硬编码外,提供配置文件

jul是一模一样的,其只是把appender改成了handler而已。

2.日志级别

package com.eryi;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.util.logging.Level;
import java.util.logging.Logger;

public class Test {
    @org.junit.Test
    public void test1() {
    	//级别由低到高,默认输出info以上级别
        Logger logger = Logger.getLogger("abc");
        logger.log(Level.FINEST,"FINEST level");
        logger.log(Level.FINER,"FINER level");
        logger.log(Level.FINE,"FINE level");
        logger.log(Level.CONFIG,"CONFIG level");
        logger.log(Level.INFO,"INFO level");
        logger.log(Level.WARNING,"WARNING level");
        logger.log(Level.SEVERE,"SEVERE level");
        logger.log(Level.FINEST,"FINEST level");
        System.out.println("hello");
    }
}

【JAVA日志框架】JUL,JDK原生日志框架详解。,JAVA SE,java,jvm,开发语言,log4j

日志为什么是红色的?因为底层调用了system.erro,所以会输出的字体是红色的。

3.配置

可以用代码的方式对JUL进行配置:

public static void main(String[] args) {
        // 获取根记录器
        Logger rootLogger = Logger.getLogger("");

        // 移除默认处理器
        rootLogger.setUseParentHandlers(false);

        // 创建控制台处理器
        ConsoleHandler consoleHandler = new ConsoleHandler();
        
        // 设置级别
        consoleHandler.setLevel(Level.INFO);

        // 设置自定义格式器
        consoleHandler.setFormatter(new SimpleFormatter());

        // 设置自定义过滤器
        consoleHandler.setFilter(new CustomFilter());

        // 将处理器添加到根记录器
        rootLogger.addHandler(consoleHandler);

        // 输出日志
        Logger logger = Logger.getLogger(JULConfigExample.class.getName());
        logger.severe("Severe message");
        logger.warning("Warning message");
        logger.info("Info message");
        logger.config("Config message");
        logger.fine("Fine message");
        logger.finer("Finer message");
        logger.finest("Finest message");
    }

    // 自定义格式器
    static class SimpleFormatter extends Formatter {
        @Override
        public String format(LogRecord record) {
            return "[" + record.getLevel() + "] - " + record.getMessage() + "\n";
        }
    }

    // 自定义过滤器
    static class CustomFilter implements Filter {
        @Override
        public boolean isLoggable(LogRecord record) {
            // 在这里可以添加自定义的过滤逻辑
            return record.getLevel().intValue() >= Level.INFO.intValue();
        }
    }

当然更合理、更方便的方式肯定是配置文件。配置文件的示例模板在jre/lib目录下:

【JAVA日志框架】JUL,JDK原生日志框架详解。,JAVA SE,java,jvm,开发语言,log4j

把它拷贝过来改一下:

【JAVA日志框架】JUL,JDK原生日志框架详解。,JAVA SE,java,jvm,开发语言,log4j

#默认配置
handlers= java.util.logging.ConsoleHandler
.level= FINEST

#file hander配置
java.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.XMLFormatter

#console handler配置
java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# 具体包路径下的日志级别
com.eryi.level = FINEST

解读一下配置:

  1. 默认配置:

    • handlers: 指定默认的处理器,这里是java.util.logging.ConsoleHandler,表示使用控制台输出。

    • .level: 设置默认的日志级别,这里是FINEST,表示记录最详细的日志。

  2. File Handler配置:

    • java.util.logging.FileHandler.pattern: 设置文件处理器的日志文件的命名模式,%h表示用户主目录,%u表示一个唯一的数值,%g表示循环计数器。这里是 %h/java%u.log

    • java.util.logging.FileHandler.limit: 设置文件处理器的每个日志文件的大小限制,这里是 50000 字节。

    • java.util.logging.FileHandler.count: 设置文件处理器循环的文件数,这里是 1 个。

    • java.util.logging.FileHandler.formatter: 设置文件处理器的日志格式,这里是 java.util.logging.XMLFormatter,表示使用 XML 格式。

  3. Console Handler配置:

    • java.util.logging.ConsoleHandler.level: 设置控制台处理器的日志级别,这里是 FINEST

    • java.util.logging.ConsoleHandler.formatter: 设置控制台处理器的日志格式,这里是 java.util.logging.SimpleFormatter,表示使用简单格式。

  4. 具体包路径下的日志级别:

    • com.eryi.level: 设置特定包路径下的日志级别,这里是 FINEST,表示 com.eryi 包下的日志级别为最详细。

这里要说一下为什么有了.level的配置之后还推出了专门指定某个包路径下日志级别的配置。是因为logger之间是有父子关系的。.level会对根logger生效,其余logger是继承自根logger的,但肯定工程上不一定是全局日志级别都是一致的,会有需求需要单独定制某一个或者某一些的logger的日志级别。

使用效果如下:

【JAVA日志框架】JUL,JDK原生日志框架详解。,JAVA SE,java,jvm,开发语言,log4j

4.继承关系

logger之间存在父子关系。

root logger是最顶层的父logger:

Logger a = Logger.getLogger("a");
Logger b = Logger.getLogger("b");
System.out.println(a.getParent());
System.out.println(b.getParent());

通过父名·子名定义父子关系:

Logger a = Logger.getLogger("a");
Logger b = Logger.getLogger("a.b");
System.out.println(a.getParent());
System.out.println(b.getParent()==a);

为什么在设计的时候会存在父子关系?

Java Util Logging(JUL)的Logger之间存在父子关系,这是为了实现日志记录的层次结构和更方便的配置管理。这种父子关系的设计使得日志记录器可以继承和继承配置。文章来源地址https://www.toymoban.com/news/detail-761721.html

到了这里,关于【JAVA日志框架】JUL,JDK原生日志框架详解。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JDK、JRE、Java SE、Java EE和Java ME有什么区别?

    Java现在已不仅仅是一种语言,从广义上说,它代表了一个技术体系。该体系根据应用方向的不同主要分为Java SE、Java EE和Java ME的3个部分。 1.SE(JavaSE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。 2.EE(JavaEE),enterprise edition,个业版,使用这种

    2024年02月12日
    浏览(43)
  • Java Logback日志框架概述及logback.xml详解

    日志技术具备的优势 可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)。· 可以随时以开关的形式控制是否记录日志,无需修改源代码。 日志体系结构 Logback日志框架 Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好 Logback是基于

    2024年02月10日
    浏览(64)
  • 如何在Oracle官网下载JAVA SE 8版本(JDK 1.8.0)

    ​ 当你搜索http://www.oracle.com/technetwork/java/javase/downloads/index.html进入Oracle公司的网站出现的是下图情况且你的电脑是64位的windows操作系统(见\\\"设置-系统-系统信息\\\"),本文有一定用处 现你处于第一栏Java downloads,点击第三栏 Java archive ,下滑点击 java SE 8(8u202 and earlier) ,进入后下滑

    2024年02月07日
    浏览(58)
  • Java开发 - 你不知道的JVM优化详解

    代码上的优化达到一定程度,再想提高系统的性能就很难了,这时候,优秀的程序猿往往会从JVM入手来进行系统的优化。但话说回来,JVM方面的优化也是比较危险的,如果单单从测试服务器来优化JVM是没有太大的意义的,不同的服务器即使环境相同,访问流量方面也是不一样

    2024年02月07日
    浏览(42)
  • 如何在Oracle官网下载JAVA SE 8版本(JDK 1.8.0)并在Linux系统下安装jdk及环境配置

    1.下载安装包 Java Archive Downloads - Java S 8 进入Oracle官网选择Linux版本jdk8  它会需要一个Oracle账号,如果无法注册可选择百度云下载 链接: https://pan.baidu.com/s/1IrWKc4R9BDPfI56sL7fXCg 提取码: 8888  2.指定安装目录 ① 将该压缩包放到 /usr/local 目录下 ② 然后解压该压缩包,如下指令:

    2024年04月25日
    浏览(63)
  • [Java SE] 彻底搞懂Java程序的三大参数配置途径:系统变量与JVM参数(VM Option)/环境变量/启动程序参数args

    一次没搞懂,处处受影响。这个问题属于基础问题,但又经常踩坑,不得不重视一下了。 IDEA中的配置位置 参数 使用方式 示例 代码获取方式 系统属性 由操作系统、JVM、应用程序主动设置 System.setProperties(Properties propes) / System.setProperties(String key,String value) / System.getProperties(

    2024年02月08日
    浏览(42)
  • 【Java SE】 详解java访问限定符

    Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符: 实际只有三种访问限定符,default的意思是默认情况下,不加这三种访问

    2024年02月04日
    浏览(46)
  • 【Java SE】类和对象详解

    Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。 面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情 。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常

    2024年01月19日
    浏览(47)
  • JAVA开发(Spring框架详解)

    javaweb项目几乎已经离不开spring框架了,spring 是一个典型的分层架构框架,它包含一系列的功能并被分为多个功能模块,springboot对spring框架又做了一层封装,以至于很多人对原来的spring框架越来越不了解。         要谈Spring的历史,就要先谈J2EE。J2EE应用程序的广泛实现是

    2023年04月20日
    浏览(40)
  • 【Java】JDK8 jvm参数配置及说明

    -Xms 或 -XX:InitialHeapSize=n 设置堆的初始值 指令1:-Xms2g 指令2:-XX:InitialHeapSize=2048m -Xmx 或 -XX:MaxHeapSize=n 设置堆区最大值 指令1: -Xmx2g 指令2: -XX:MaxHeapSize=2048m -XX:NewSize=n 设置年轻代大小 -Xss 或 -XX:ThreadStackSize=n 每个线程堆栈最大值 指令1:-Xss256k 指令2:-XX:ThreadStackSize=256k 注意:

    2024年02月03日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包