[JavaSE](​​日志、logback日志、添加模板、类加载器、resources文件夹)

 ✨✨个人主页:沫洺的主页

📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 

                           📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏

                           📖Docker专栏📖Reids专栏📖MQ专栏📖SpringCloud专栏     

💖💖如果文章对你有所帮助请留下三连✨✨

🥝日志

概述

  • 程序中的日志可以用来记录程序在运行的时候点点滴滴。并可以进行永久存储。

日志与输出语句的区别

输出语句 日志技术
取消日志需要修改代码,灵活性比较差不需要修改代码,灵活性比较好
输出位置只能是控制台可以将日志信息写入到文件或者数据库中
多线程和业务代码处于一个线程中多线程方式记录日志,不影响业务代码的性能

🥥日志体系结构

🍈logback

Logback介绍

  • Logback是基于slf4j的日志规范实现的框架,性能比之前使用的log4j要好
  • 官方网址:https://logback.qos.ch/index.html

Logback主要分三个技术模块

  • logback-core: 该模块为其他两个模块提供基础代码,必须有
  • logback-ckassic: 完整实现了slf4j APS的模块
  • logback-access 模块与Tomcat 和 Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志功能

Logback的作用

  • 通过使用logback,可以控制日志信息输送的目的地是控制台、文件等位置。
  • 可以控制每一条日志的输出格式。
  • 通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。
  • 可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

 Logback入门使用

  1. 导入logback的相关jar包

  2. 编写logback配置文件

  3. 在代码中获取日志的对象

  4. 按照级别设置记录日志信息

添加jar包

可以去网盘下载下来,然后复制到项目模块下

链接:https://pan.baidu.com/s/1NgM50O0X71Qm6LncPyReiw?pwd=wznb 
提取码:wznb 

 复制到模块src下

 添加配置文件(注意日志保存的路径)

 注意jar包和配置文件都是放在src文件夹下

代码演示

package cn.moming1;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Scanner;

public class LogDemo {
    //获取日志对象
    private static final Logger LOGGER = LoggerFactory.getLogger(LogDemo.class);

    public static void main(String[] args) {
        //打日志
        Scanner sc = new Scanner(System.in);
        System.out.println("输入姓名");
        String name = sc.nextLine();
        //面向日志对象,调用方法,记录日志
        //通过核心配置文件可以指定日志记录的位置
        LOGGER.info("用户输入的姓名为:"+name);

        System.out.println("输入年龄");
        String age = sc.nextLine();
        try {
            int ageInt = Integer.parseInt(age);
            LOGGER.info("用户输入的年龄为:"+age);
        } catch (NumberFormatException e) {
            LOGGER.info("用户输入的年龄格式错误->"+age);
        }
    }
}
输入姓名
moming
2022-08-20 10:31:23.482 [INFO ]  cn.moming1.LogDemo [main] : 用户输入的姓名为:moming
输入年龄
18
2022-08-20 10:31:29.142 [INFO ]  cn.moming1.LogDemo [main] : 用户输入的年龄为:18
输入姓名
moming
2022-08-20 10:31:52.357 [INFO ]  cn.moming1.LogDemo [main] : 用户输入的姓名为:moming
输入年龄
abc
2022-08-20 10:31:55.999 [INFO ]  cn.moming1.LogDemo [main] : 用户输入的年龄格式错误->abc

然后找到日志文件

🍉配置文件

如果系统上线后只想记录一些错误的日志信息或者不想记录日志,怎么办?

  • 可以通过设置日志的输出级别来控制哪些日志信息输出或者不输出
  • 级别程度依次是:TRACE<DEBUG<INFO<WARN<ERROR<FATAL
  • 默认级别是debug(忽略大小写)
  • 作用:将开发中不同的日志信息进行分类,只输出大于等于该日志级别的日志信息
  • ALL和OFF分别是打开全部日志信息,及关闭全部日志信息

🍋配置文件添加模板

🍊类加载器

什么是类加载器

  • 类加载器负责将.class文件(存储的物理文件)加载到内存中

类加载的时机

类在什么时候会被加载到内存中呢?

  • 创建类的实例(对象)

  • 调用类的类方法

  • 访问类或者接口的类变量,或者为该类变量赋值

  • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

  • 初始化某个类的子类

  • 直接使用java.exe命令来运行某个主类

总结就是,用到就加载

类加载的过程

加载(把.class文件读到内存里边)

  • 通过包名 + 类名,获取这个类,准备用流进行传输

  • 在这个类加载到内存中

  • 加载完毕创建一个class对象

链接

  • 验证

    确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全

    (文件中的信息是否符合虚拟机规范有没有安全隐患)

  • 准备

    负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值

    (初始化静态变量)

  • 解析

    将类的二进制数据流中的符号引用替换为直接引用

    (本类中如果用到了其他类,此时就需要找到对应的类)

初始化

根据程序员通过程序制定的主观计划去初始化类变量和其他资源

(静态变量赋值以及初始化其他资源)

小结

  • 当一个类被使用的时候,才会加载到内存

  • 类加载的过程: 加载、验证、准备、解析、初始化

类加载器分类

  • Bootstrap class loader:启动类加载器,虚拟机的内置类加载器,通常表示为null ,并且没有父null

  • Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块

  • System class loader:系统类加载器,负责加载用户类路径上所指定的类库

  • UserClassloader:自定义类加载器

类加载器的继承关系

  • System的父加载器为Platform

  • Platform的父加载器为Bootstrap

双亲委派模型

介绍

  • 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式

目的:为了保证一个类最多只能加载1次

代码示例(只是演示一下双亲委派机制的过程)

package cn.moming4;

public class ClassLoaderDemo1 {
    public static void main(String[] args) {
        //获得系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        //获取系统类加载器的父加载器--平台类加载器
        ClassLoader classLoader1 = systemClassLoader.getParent();
        //获取平台类加载器的父加载器--启动类加载器
        ClassLoader classLoader2 = classLoader1.getParent();

        System.out.println("系统类加载器:"+systemClassLoader);
        System.out.println("平台类加载器:"+classLoader1);
        System.out.println("启动类加载器:"+classLoader2);
    }
}
系统类加载器:jdk.internal.loader.ClassLoaders$AppClassLoader@63947c6b
平台类加载器:jdk.internal.loader.ClassLoaders$PlatformClassLoader@41629346
启动类加载器:null

获取类加载器的两种方法

推荐使用第二种

package cn.moming4;

public class MyLoader {
    public static void main(String[] args) {
        //1.直接使用ClassLoader的静态方法
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);
        //2.可以利用当前类的字节码文件对象,调用getClassLoader()
        ClassLoader classLoader = MyLoader.class.getClassLoader();
        System.out.println(classLoader);

        System.out.println(classLoader==systemClassLoader);
    }
}
jdk.internal.loader.ClassLoaders$AppClassLoader@63947c6b
jdk.internal.loader.ClassLoaders$AppClassLoader@63947c6b
true

类加载器的常用方法

方法名说明
public static ClassLoader getSystemClassLoader()获取系统类加载器
public InputStream getResourceAsStream(String name)加载某一个资源文件

练习使用类加载器读配置文件

先创建一个资源文件(在src路径下因为类加载器是从src路径下开始的

 加载资源文件

package cn.moming4;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ClassLoaderDemo2 {
    public static void main(String[] args) throws IOException {
        //获取系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        //加载某一个资源文件
        //利用加载器去加载一个指定的文件
        //参数:文件的路径
        //返回值:字节流
        InputStream is = systemClassLoader.getResourceAsStream("prop.properties");
        Properties prop = new Properties();
        prop.load(is);
        System.out.println(prop);
        is.close();
    }
}
{name=moming, age=18}

补充

🍓resources文件夹

在实际开发中,配置文件一般是放在resources文件夹中,效果和src一样

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沫洺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值