Java日志框架-JUL

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

JUL全称Java util logging

入门案例

先来看着入门案例,直接创建logger对象,然后传入日志级别和打印的信息,就能在控制台输出信息。Java日志框架-JUL,java日志,java,python,linux

 可以看出只输出了部分的信息,其实默认的日志控制器是有一个默认的日志级别的,默认就是info 所以最多优先级比info低的都不能输出。

Java日志框架-JUL,java日志,java,python,linux

 文章来源地址https://www.toymoban.com/news/detail-667251.html

    @Test
    public  void testQuick() {
        System.out.println("hello");
        //传入唯一标识,一般为当前的类名
       Logger logger=  Logger.getLogger("com.itheima.julTest");
       
        logger.severe("severe logger message");//logger.log(Level.severe,"logger message");
        logger.warning("warning logger message");
        logger.info("info logger message");  //默认日志级别
        logger.config("config logger message");
        logger.fine("fine logger message");
        logger.finer("finer logger message");
        logger.finest("finest logger message");
    }

自定义日志级别

设置handler,设置handler和logger的级别

  • Handler:日志处理器,每个Logger会关联持有多个Handler,Logger会把日志交给Handler进行处理,由Handler负责日志记录。Handler在这里是一个抽象,其具体实现决定了日志输出的位置,比如控制台,文件等

也就是说,通过使用不同的handler可以将日志输出到文件或者控制台。

下面这个地方:
            //logger设置不使用父logger的handler,不然日志会重复记录。此处后面会讲
            logger.setUseParentHandlers(false);

如果不设置,将会输出两边日志信息

 @Test
    public  void loggerLevel() {

            //创建日志记录器,传入参数是日志记录器的名称
            Logger logger = Logger.getLogger("com.itheima");

            //创建一个输出到控制台的handler
            ConsoleHandler consoleHandler = new ConsoleHandler();
            //设置handler的日志级别为ALL,输出全部日志。
            consoleHandler.setLevel(Level.ALL);

            //把handler添加到logger中
            logger.addHandler(consoleHandler);
            //logger也设置日志级别为ALL
            logger.setLevel(Level.ALL);

            //logger设置不使用父logger的handler,不然日志会重复记录。此处后面会讲
            logger.setUseParentHandlers(false);
            //记录severe级别信息
            logger.severe("severe信息");
            //记录warning级别信息
            logger.warning("warning信息");
            logger.info("info信息");
            logger.config("config信息");
            logger.fine("fine信息");
            logger.finer("finer信息");
            logger.finest("finest信息");
        }

父子关系

一开始以为是继承,后来发现并不是,只是通过设置可以复用一些配置

默认父子关系通过名称的层级关系来确定的。层级关系用 . 号分开。

也可以通过手动设置。

JUL在初始化时会创建一个顶层的RootLogger作为所有Logger的父Logger。

下面的代码中就是:rootlogger->logger1->logger2logger3.

 @Test
    public void testLoggerParent(){
        //创建一个名称为aaa的logger
        Logger logger1 = Logger.getLogger("aaa");

        //创建一个名称为aaa.bbb的logger
        Logger logger2 = Logger.getLogger("aaa.bbb");

        //创建一个名称为aaa.bbb.ccc的logger
        Logger logger3 = Logger.getLogger("aaa.bbb.ccc");

        //此时logger3的父Logger是logger2, logger2的父logger是logger1

        //判断logger3的父Logger是不是logger2
        System.out.println(logger3.getParent() == logger2);

        //判断logger2的父logger是不是logger1
        System.out.println(logger2.getParent() == logger1);

        //logger1的父节点是顶级Logger RootLogger
        System.out.println("logger1的父logger是 " + logger1.getParent());

        //RootLogger的父Logger
        System.out.println("RootLogger的父Logger是 " + logger1.getParent().getParent());

        //手动设置父Logger
        logger3.setParent(logger1);
        //判断设置是否成功
        System.out.println(logger3.getParent() == logger1);

    }

子Logger默认会使用父Logger的Handler对象

如果使用addHandler添加新的handler,也会使用新添加的handler再输出一次
 

    @Test
    public void testUserParentHandler()  {
        //创建一个名为aaa的logger
        Logger logger1 = Logger.getLogger("aaa");
        //创建一个名为aaa.bbb的logger,父Logger是handler
        Logger logger2 = Logger.getLogger("aaa.bbb");

        //创建一个handler
        ConsoleHandler consoleHandler  = new ConsoleHandler();

        //把handler添加到logger1和logger2中。
        logger1.addHandler(consoleHandler);
        logger2.addHandler(consoleHandler);

        //使用logger进行日志输出

        //记录severe级别信息
        logger2.severe("severe信息");
        //记录warning级别信息
        logger2.warning("warning信息");
        logger2.info("info信息");
        logger2.config("config信息");
        logger2.fine("fine信息");
        logger2.finer("finer信息");
        logger2.finest("finest信息");

    }

Java日志框架-JUL,java日志,java,python,linux分析:
每个级别的日志信息输出了三次,因为logger2使用了父Logger logger1 ,父Logger的父Logger RootLogger、还有自身的handler共三个handler,所以日志会输出三倍。

 

使用logger2.setUseParentHandlers(false); 设置不使用父Logger的Handler。

FileHandler和SimpleFormatter

前面说到了通过设置handler可以将日志输出到文件,这里就测试一下

Java日志框架-JUL,java日志,java,python,linux

 

    @Test
    public void testFileHandler(){
        Logger logger = Logger.getLogger("juldemo.JULDemo");
        logger.setLevel(Level.ALL);
        try {
            //创建一个输出到文件的handler,第一个参数是生成文件名的pattern,第二个参数是是否已追加的方式输出到文件,默认false
            FileHandler fileHandler = new FileHandler("D:\\project\\idea\\log_learning\\jul_demo\\logs\\java%u.log",true);
            //创建一个SimpleFormatter,输出格式
            SimpleFormatter formatter = new SimpleFormatter();
            //设置formatter
            fileHandler.setFormatter(formatter);
            //设置日志级别
            fileHandler.setLevel(Level.ALL);
            //把handler添加到logger
            logger.addHandler(fileHandler);
            //设置不使用父Logger的handler
            logger.setUseParentHandlers(false);
            logger.severe("severe信息");
            //记录warning级别信息
            logger.warning("warning信息");
            logger.info("info信息");
            logger.config("config信息");
            logger.fine("fine信息");
            logger.finer("finer信息");
            logger.finest("finest信息");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

通过配置文件配置


#配置RootLogger的Handler,有java.util.logging.ConsoleHandler,java.util.logging.FileHandler
handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler

#配置RootLogger的日志级别ALL
.level= ALL

java.util.logging.FileHandler.pattern = D:\\project\\idea\\log_learning\\jul_demo\\logs\\java%u.log
#默认一个文件最多50000条日志记录
java.util.logging.FileHandler.limit = 50000
#设置FileHandle的日志级别为ALL
java.util.logging.FileHandler.level= ALL

#配置生成一个文件
java.util.logging.FileHandler.count = 1
#配置使用SimpleFormatter格式器
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
#配置追加模式
java.util.logging.FileHandler.append=true

#ConsoleHandler的日志级别默认是INFO
java.util.logging.ConsoleHandler.level = ALL
#ConsoleHandler的默认格式化器时SimpleFormatter
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter



#设置日志格式
java.util.logging.SimpleFormatter.format= %1$tc %2$s%n%4$s: %5$s%6$s%n


    @Test
    public void testCustomConfig(){
        LogManager logManager = LogManager.getLogManager();
        try {
            logManager.readConfiguration(this.getClass().getClassLoader().getResourceAsStream("logging.properties"));
            Logger logger = Logger.getLogger("juldemo.JULDemo");
            logger.severe("severe信息");
            //记录warning级别信息
            logger.warning("warning信息");
            logger.info("info信息");
            logger.config("config信息");
            logger.fine("fine信息");
            logger.finer("finer信息");
            logger.finest("finest信息");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

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

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

相关文章

  • Java日志框架概览

      SLF4J 提供统一的日志门面API,即图中紫色部分,实现中立的日志记录API 桥接功能,蓝色部分,把各种日志框架API(绿色部分)桥接到SLF4J API。这样即便你的程序中使用各种日志API记录日志,最终都可桥接到SLF4J门面API。 适配功能,红色部分,可实现SLF4J API和实际日志框架(

    2024年02月11日
    浏览(34)
  • Spring Boot 如何使用 JUL 进行日志记录

    在 Spring Boot 中,我们可以使用多种日志框架进行日志记录。其中,JUL (Java Util Logging) 是 Java 平台自带的日志框架,它提供了简单的 API 和配置,可以轻松地进行日志记录。本文将介绍如何在 Spring Boot 中使用 JUL 进行日志记录,并提供示例代码。 默认情况下,Spring Boot 使用 L

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

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

    2024年02月10日
    浏览(59)
  • java的springboot框架中使用logback日志框架使用RabbitHandler注解为什么获取不到消费的traceId信息?

    当使用 Logback 日志框架和 RabbitMQ 的 @RabbitHandler 注解时,如果无法获取消费的 traceId 信息,可能是因为在处理 RabbitMQ 消息时,没有正确地将 traceId 传递到日志中。 为了将 traceId 传递到日志中,你可以利用 MDC(Mapped Diagnostic Context)机制。MDC 是一个线程绑定的上下文容器,允许

    2024年02月09日
    浏览(44)
  • Spring Boot中集成各种日志框架Logback、Log4j2和Java Util Logging

    Spring Boot支持多种日志框架,包括Logback、Log4j2和Java Util Logging(JUL)。在Spring Boot中,可以通过简单的配置来集成这些热门的日志框架。 下面将详细说明如何集成Logback、Log4j2和Java Util Logging,并提供相应的源代码示例。 集成Logback: Logback是Spring Boot默认的日志框架,它提供了高

    2024年02月05日
    浏览(54)
  • 利用selenium获取Chrome日志(Java版和Python版)

    1.方式一(推荐优先使用该方式) 2.方式二

    2024年02月17日
    浏览(59)
  • 【华为OD机试】运维日志排序(Java&Python&C++&JS实现)

    本文收录于专栏:算法之翼 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年04月27日
    浏览(43)
  • 【免费题库】华为OD机试 - 日志限流(Java & JS & Python & C & C++)

    哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 某软件系统会在运行过程中持续产生日志,系统每天运行 N 单位时间,运行期间每单位时 间产生的日志条数保行在数组 records 中。 records[i]表示第 i 单位时间内产生日志条数。 由于

    2024年04月12日
    浏览(48)
  • 【华为OD统一考试B卷 | 100分】 运维日志排序(C++ Java JavaScript Python)

    在线OJ 已购买本专栏用户,请私信博主开通账号,在线刷题!!! 运行出现 Runtime Error 0Aborted,请忽略 华为OD统一考试A卷+B卷 新题库说明 2023年5月份,华为官方已经将的 2022/0223Q(1/2/3/4)统一修改为OD统一考试(A卷)和OD统一考试(B卷)。 你收到的链接上面会标注A卷还是B卷。

    2024年02月10日
    浏览(39)
  • Java、Python、C++和C#的界面开发框架和工具的重新介绍

    好的,以下是Java、Python、C++和C#的界面开发框架和工具的重新介绍: Java界面开发: Swing: 是Java提供的一个基于组件的GUI工具包,可以创建跨平台的图形用户界面。它提供了丰富的组件和布局管理器,使得界面开发相对简单。Swing是Java AWT的继承者,支持更多的功能和外观。

    2024年02月02日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包