• SpringBoot日志文件


    日志文件作用

    日志是程序的重要组成部分,我们通常情况下程序出现bug,都是通过日志信息更改bug!

    日志最基本的功能就是发现和定位问题(找bug),我们还可以通过日志实现一下功能:

    • 记录用户登入信息日志,可以分析用户是否正常登入还是恶意破解用户!
    • 记录系统操作日志,方便数据恢复和定位问题!
    • 记录程序运行时间,方便后续程序优化进行数据支持!

    我们可以将日志类比于游戏存档,当你玩游戏,突然手机关机了,当你再次打开游戏,游戏的进度还是你但是关机的时候的进度,日志也是如此,就是记录下了程序的运行的操作过程,便于后续定位到程序发生问题的位置然后方便恢复数据!

    日志使用

    创建一个SpringBoot项目
    删除无效的文件
    在这里插入图片描述
    启动项目!
    在这里插入图片描述
    控制台输出的信息就是日志信息!
    我们通过这里的日志信息可以看到程序是否运行成功!
    日志格式说明:
    在这里插入图片描述
    通过上面日志信息的打印,我们知道:

    • SpringBoot项目内置了日志框架(否则输出不了日志)
    • 系统默认日志打印到控制体,我们开发者如何自定义打印日志?
    • 日志默认只能在控制台显示,如何永久存储日志信息?

    自定义打印日志

    • 获取到日志框架中的日志对象
    • 通过日志对象中的方法打印日志信息

    我们日志对象Logger类来自slf4j

    在这里插入图片描述

    package com.example.demo.controller;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    @Controller //将该Bean注册到spring
    @ResponseBody //SpringMVC默认返回静态页面,修改默认
    public class Userlogger {
        //通过slf4j中的LoggerFactory日志工程或者到日志对象!
        //这里需要传入当前类的反射,指定日志来源
        private Logger log = LoggerFactory.getLogger(Userlogger.class);
        //设置路由
        @RequestMapping("/sayHi")
        public void sayHi(){
            //通过log对象自定义打印日志!
            log.trace("trace");
            log.debug("debug");
            log.info("info");
            log.error("error");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述
    在浏览器访问这个sayHi接口,控制台就打印了我们自定义的日志信息!

    Slf4j

    这里我们使用的Slf4j采用的门面模式!
    就相当于一个代理,一个门面,底层的日志实现是logback等实现方式实现的!
    就是说这种方式,就算底层的实现模式,更改了,也不会影响Slf4j!

    在这里插入图片描述

    日志级别

    看了刚刚的自定义日志打印信息,可能你会疑惑,为啥我写了4个日志打印语句,结果只打印了2个日志?

    日志级别:

    • trace: 微量,少许,最低级别日志!
    • debug: 调试时关键信息日志打印!(调试)
    • info: 普通日志打印信息!(默认级别)
    • error: 错误信息,较高级别的日志信息(可自定义的最高级别)
    • fatal:致命的,因为代码异常导致程序退出!

    上面的日志级别由低到高!
    前面4种日志级别都可以自定义打印!
    最后一种无法自定义,由系统完成!
    日志默认是info级别!

    日志级别作用

    可能看到这,还是有点懵!
    这日志级别有啥子用?

    我们可以日志级别的设置,过滤掉一些我们不需要的日志信息,比如你只想找程序保存的日志,你就可以将日志级别设置成error这样一来,你就看不到比error级别更低的日志(trace,info,debug),通过这种这种方式,你可以快速定位问题!

    设置日志级别

    我们刚刚演示的项目,因为没有设置日志级别,直接就是默认info级别,所以没有打印trace/debug日志信息!

    我们可以通过配置文件设置当前项目日志级别

    • 设置全局的日志级别
    # 设置全局日志级别
    logging.level.root = error
    
    • 1
    • 2

    这里的全局root指的是项目的源文件java目录

    所以设置指定包下的日志级别也是从这个java目录开始!

    • 设置某一包下的日志级别(局部)
    # 设置某一包下的日志级别(局部)
    logging.level.com.example.demo.controller = trace
    
    • 1
    • 2

    再次启动项目
    在这里插入图片描述
    因为我们设置的默认日志级别为error,所以项目启动成功的日志信息(info)未打印到控制台

    我们通过浏览器访问一下sayHi!
    在这里插入图片描述
    可以看到我们在controller包下自定义日志打印信息就打印到了控制台!

    可以看到日志配置级别优先级局部大于全局

    永久化存储日志

    我们发现日志现在虽然可以自定义了,但是存在一个问题,只能在控制台看,如果项目突然就关闭了,那我们日志岂不是没了!
    我们如何进行日志持久化存储呢?

    配置日志保存的路径位置/文件

    我们可以通过配置文件,配置日志需要保存的路径位置或者日志保存在那个文件下

    • 配置日志保存到某一路径下

    在这里插入图片描述
    在这里插入图片描述
    配置保存到上面路径下!
    但是报错了,因为\将字符转义了,所以我们可以使用\\或者/代替!
    建议使用/因为我们的程序要部署在Linux

    # 配置日志保存路径
    #错误!
    #logging.flile.path = D:\java\src
    #正确配置
    logging.file.path= D:/java/src
    
    • 1
    • 2
    • 3
    • 4
    • 5

    启动项目
    在这里插入图片描述
    自动生成了一个spring.log的日志文件,里面的日志内容和控制台上的一样!
    在这里插入图片描述
    这样我们就可以持久化存储日志了!

    • 配置日志保存在某一日志文件下
    # 配置日志保存在log.log文件下
    logging.file.name=D:/java/src/log.log
    
    • 1
    • 2

    在这里插入图片描述

    如果我们不指定保存的路径,系统会保存在这个项目中的target目标文件夹下
    在这里插入图片描述

    通常情况下,日志文件默认大小为10M,如果项目中的日志文件大小超过了这个默认值,会进行切分,再生成新的日志日志文件,这里的默认日志大小也可以直接修改!

    更简单的日志输出lombok

    我们刚刚自定义输出日志,如果要获取某一个类的日志时,要先获取到这个类的日志对象,显然有些许的麻烦,当有很多类都要获取日志时,这个步骤就重复了,如何省略这个繁琐的步骤呢?

    我们知道Spring项目嘛,无法就是一个注解,就搞好了嘛!
    这里也是如此,我们通过@slf4j就可以省略下面获取日志对象的代码

    package com.example.demo.controller;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    @ResponseBody
    @Controller 
    @Slf4j //获取到这个类的日志对象 log
    public class Slf4jlogger {
        @RequestMapping("/hello")
        public String Hello(){
            //通过上@Slf4j 注解生成的 log 对象自定义打印日志!
            System.out.println("@Slf4j");
            log.trace("trace");
            log.debug("debug");
            log.info("info");
            log.error("error");
            return "@Slf4j";
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述
    这里的@Slf4j日志注解是来着lombok框架的,我们引入lombok框架即可使用该备注! 使用该备注默认在当前类中生成了一个log日志对象!

    lombok框架注解

    在这里插入图片描述
    在这里插入图片描述

    注解实现原理

    我们通过使用了lombok下注解的源代码和字节码文件对比就可以明白其实现原理!

    源文件

    在这里插入图片描述
    目标文件
    在这里插入图片描述
    可以看到在源代码中的@Slf4j注解,在字节码class文件中,消失不见了,然后多了创建日志对象的语句

      private static final Logger log = 
      		LoggerFactory.getLogger(Slf4jlogger.class);
    
    • 1
    • 2

    就是说lombok里的注解,在编译阶段就会自动生成对应的语句代码,然后编译成字节码!

  • 相关阅读:
    ROS学习笔记(19):建图与定位(3)
    `英语` 2022/8/8
    使用pycharm or vscode来编写python代码?
    实战| 记一次shiro序列化到接管服务器
    java计算机毕业设计家教平台系统MyBatis+系统+LW文档+源码+调试部署
    30 位学者合力发表 Nature 综述,10 年回顾解构 AI 如何重塑科研范式
    最简单检查jar包状态并实现自愈脚本
    XSS进阶之CSP绕过
    【luogu P8326】Fliper(图论)(构造)(欧拉回路)
    SpringBoot热部署
  • 原文地址:https://blog.csdn.net/weixin_52345071/article/details/126723244