Java日志框架(根据黑马程序员(BV11g411P7mv)整理)

本文详细介绍了Java内置的日志框架JUL(Java Util Logging),包括其概念、模型、日志级别、代码示例、日志配置文件的使用以及Logger对象的父子关系。内容覆盖了从基础的日志输出到自定义日志级别和配置,帮助读者理解和掌握JUL的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java日志框架(根据黑马程序员(BV11g411P7mv)整理)

  最近开始到公司实习,发现公司日志代码属实看不太懂(所以最近的Log4j的事件
  我不用半夜爬起来,哈哈),就想着到B站学习一下日志代码的书写,正好看到黑
  马程序员出了日志框架的视频,在这做一下笔记。

懒得动手的同学可以在文末下载XMind文件(可能需要XMind VIP)。
在这里插入图片描述

一、JUL(Java util Logging)

1.概念&模型
1.1 概念
JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框架使用方便,学习简单,能够在小型应用中灵活使用。
1.2 模型
图片
在这里插入图片描述
2.代码
2.1 创建项目
创建一个maven项目,并导入jdk1.8和junit,如下图
在这里插入图片描述
2.2 入门例子
2.2.1 快速入门案例

在这里插入图片描述

 @Test
    public void testQuick() throws Exception{
        // 1.获取日志记录器对象
        Logger logger = Logger.getLogger("JULDemo1"); //一般起名为本类名

        // 2.日志记录输出
        logger.info("hello JUL");

        // 通用方法进行日志记录
        logger.log(Level.INFO, "info meg"); //日志级别,字符串消息

        // 通过占位符方式输出变量
        String name = "ghost";
        Integer age = 18;
        logger.log(Level.INFO, "用户信息:{0},{1}", new Object[]{name, age}); //占位符{0}对应name,{1}对应age
    }

一些注意点:
占位符的{0}对应后面写的第一个参数name,{1}对应age,可以交换{0}和{1}位置,如下图
在这里插入图片描述
这个Logger是JDK8里面的,见下图
在这里插入图片描述
2.2.2 日志级别详解
2.2.2.1七种日志级别
1.SEVERE:最高级别,错误级别信息。比如说程序出现了严重问题造成了程序的终止,就可以用SEVERE进行记录。
在这里插入图片描述

2.WARNING:级别比SEVERE低一点,警告信息。记录程序发生的一些问题,这些问题不会造成程序的终止。
在这里插入图片描述

3.INFO:级别比WARNING低一点,消息记录。记录一些数据库的连接信息、IO的传递信息、网络通信信息都可以交给info。
在这里插入图片描述

4.CONFIG:级别比INFO低一点,配置信息。加载了配置文件,读取了配置文件的参数,都可以用CONFIG进行记录。
在这里插入图片描述
5:FINE&FINER&FINEST:debug日志记录的消息。用来记录程序的运行的状态、执行的流程还有参数的传递信息,FINE、FINER、FINEST的颗粒度有所不一。
在这里插入图片描述

6:ALL:全部日志开启。ALL的value值是Interger类型的最小值,比上面的日志级别的value值都小,设置了ALL那么全部日志级别都会开启。
在这里插入图片描述
7:OFF:全部日志关闭,解释见6。
在这里插入图片描述
同理,如果设置了日志级别为INFO(value=800),那么比INFO的value值低的CONFIG(700)、FINE(500)等等不会进行输出,而比INFO的value值高的WARNING(900)与SEVERE(1000)会进行输出。

2.2.2.2 日志级别代码示例
在这里插入图片描述
可见,只输出了info及以上vlaue值的日志信息。

    @Test
    public void testLogLevel() throws Exception{
        // 1.获取日志记录器对象
        Logger logger = Logger.getLogger("JULDemo1"); //一般起名为本类名

        // 2.日志记录输出
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info"); //JUL默认的日志级别
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }

2.2.2.3 自定义日志级别代码
在这里插入图片描述

/*自定义日志级别*/
    @Test
    public void testLogConfig() throws Exception{
        // 获取日志记录器对象
        Logger logger = Logger.getLogger("JULDemo1"); //一般起名为本类名

        // 关闭系统默认配置
        logger.setUseParentHandlers(false);

        /*自定义配置日志级别*/
        // 创建ConsoleHandler
        ConsoleHandler consoleHandler = new ConsoleHandler();

        // 创建简单格式转换对象
        SimpleFormatter simpleFormatter = new SimpleFormatter();

        // 进行关联
        consoleHandler.setFormatter(simpleFormatter);
        logger.addHandler(consoleHandler);

        // 配置日志具体级别
        logger.setLevel(Level.ALL);
        consoleHandler.setLevel(Level.ALL); //处理器也配置一下

        // 日志记录输出
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info"); //JUL默认的日志级别
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }

查看输出结果,可以看到所有级别都输出了,如下图:
在这里插入图片描述
如上只是打印在控制台,现在我们创建一个FileHandler打印到指定路径上:
在这里插入图片描述

        // 场景
        FileHandler fileHandler = new FileHandler("C:\\Users\\ghost\\Desktop\\JUL.log"); //输出到桌面

        // 进行关联
        fileHandler.setFormatter(simpleFormatter);
        logger.addHandler(fileHandler);

因为是输出到桌面的JUL.log上,我们到桌面创建一个JUL.log,如下图:
在这里插入图片描述
然后运行程序,再打开这个文件查看:
在这里插入图片描述

2.3 Logger对象父子关系
2.3.1 所有日志记录器的顶级父元素
在这里插入图片描述

/*Logger对象父子关系*/
    @Test
    public void testLogParent() throws Exception{
        Logger logger1 = Logger.getLogger("com.ghost");
        Logger logger2 = Logger.getLogger("com");

        /*测试*/
        // 判断logger1的父对象是不是logger2
        System.out.println(logger1.getParent() == logger2); //true
        // 所有日志记录器的顶级父元素:LogManager$RootLogger,name为一个空字符串:""
        System.out.println("logger2 Parent:" + logger2.getParent() + ",name:" + logger2.getParent().getName());
    }

输出结果如下图:
在这里插入图片描述
2.3.2 继承
com.ghost会继承com,而com没有我们自己定义的父包,就是继承LogManager$RootLogger,如下图
在这里插入图片描述

/*Logger对象父子关系*/
    @Test
    public void testLogParent() throws Exception{
        Logger logger1 = Logger.getLogger("com.ghost");
        Logger logger2 = Logger.getLogger("com");

        /**
         * 这里把logger2的日志级别设置为ALL,logger1的不变,然后输出logger1,看看会不会有继承关系
         * */
        // 关闭系统默认配置
        logger2.setUseParentHandlers(false);

        /*自定义配置日志级别*/
        // 创建ConsoleHandler 控制台输出
        ConsoleHandler consoleHandler = new ConsoleHandler();

        // 创建简单格式转换对象
        SimpleFormatter simpleFormatter = new SimpleFormatter();

        // 进行关联
        consoleHandler.setFormatter(simpleFormatter);
        logger2.addHandler(consoleHandler);

        // 配置日志具体级别
        logger2.setLevel(Level.ALL);
        consoleHandler.setLevel(Level.ALL); //处理器也配置一下

        // 日志记录全部都输出了,说明com.ghost会继承com,而com没有我们自己定义的父包,就是继承LogManager$RootLogger
        logger1.severe("severe");
        logger1.warning("warning");
        logger1.info("info"); //JUL默认的日志级别
        logger1.fine("fine");
        logger1.finer("finer");
        logger1.finest("finest");
    }

输出结果如下,说明有继承关系:
在这里插入图片描述

2.3 JUL配置文件入门
为了方便管理,我们希望把日志文件的相关配置都放到配置文件里。
怎么做呢,我们先回到上面的父子关系例子,logger对象在实例化之前一定会实例化他的顶级父元素,我们先来看看logger对象是怎么创建的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们再次回到上一步
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
回到父子关系的例子里,debug执行
在这里插入图片描述
先进入了我们打的第一个断点里
在这里插入图片描述
继续往下走就看到第二个断点
在这里插入图片描述
先加载配置类
在这里插入图片描述
再找配置文件和jre
在这里插入图片描述
最后找到logging.properties,我们复制路径进去看一下这个日志文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
简化一下
在这里插入图片描述
把这些放到IDEA里
在这里插入图片描述

修改日志级别观察是否成功
先修改日志文件
在这里插入图片描述
然后再写段代码来输出日志信息
在这里插入图片描述
查看控制台输出,可以看到全都输出了,确实是ALL级别
在这里插入图片描述
我们可以指定输出的路径,handlers里配置了两个,就向两个地方都输出(这里就是控制台和/logs里都输出),我这里就直接丢到桌面
在这里插入图片描述

再次执行代码
可以看到控制台输出了
在这里插入图片描述
回到桌面查看也可以看到有java0了(第一个日志文件是0,第二个1,以此类推)
在这里插入图片描述
在这里插入图片描述

2.4 JUL配置文件详解

### 黑马程序员教程的云盘下载链接 根据提供的资料,以下是关于黑马程序员教程的相关资源及其可能存在的云盘下载方式: #### 关于Java教程 对于Java相关的教学内容,可以参考以下资源[^1]: - **项目地址**: 提供了Java最新教程的内容存储位置。可以通过访问 `https://gitcode.com/Resource-Bundle-Collection/5d2bf` 获取相关内容。 如果需要更完整的课程材料或者希望找到对应的云盘下载链接,建议通过搜索引擎输入关键词“黑马程序员 Java 教程 百度网盘”,通常会发现由其他用户分享的学习资源。 #### C++教程 针对C++的教学内容,有如下参考资料[^2]: - 笔记《黑马程序员C++教程从0到1入门编程》提供了详细的Word版本文档,并附带百度网盘下载链接。 可以直接前往B站视频页面 (`https://www.bilibili.com/video/BV1et411b73Z`) 查看是否有进一步说明或评论区提供具体下载路径。 #### 数据结构与算法 (Java) 有关数据结构与算法方面的学习需求,则可利用此资源[^3]: - 【数据结构与算法Java版】讲义源码同样适用于深入理解程序设计中的核心概念和技术实现方法。 虽然官方并未直接给出特定形式的云端储存连接,但依据惯例,在一些公开平台上可能会存在整理好的压缩包文件可供免费获取。 #### JavaWeb综合案例 最后提到的是JavaWeb方向的实际应用训练素材[^4]: - 包含从前端界面构建至后台逻辑处理全流程讲解的系列课程以及配套实例代码库(`https://github.com/HaiLei-Fly/JavaWeb-brand`)。 为了便于离线查阅全部知识点并实践操作演示效果,推荐尝试联系原作者索要授权后的完整电子档副本;另外也可以留意各大教育类论坛里是否有人上传过相似主题的作品集锦贴子。 --- ### 注意事项 由于版权保护等原因,部分正版教材不会轻易开放公共网络上的随意传播途径,请务必尊重创作者劳动成果,在合法合规前提下合理使用各类共享信息。 ```bash wget --no-check-certificate 'https://example.com/path/to/resource.zip' -O resource.zip unzip resource.zip ``` 上述命令可用于模拟从指定URL下载ZIP格式档案后再解压的过程(仅作为技术示范用途),实际执行前需替换真实有效的网址参数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值