SpringBoot日志文件

举报
bug郭 发表于 2022/10/06 22:27:53 2022/10/06
【摘要】 日志文件作用日志是程序的重要组成部分,我们通常情况下程序出现bug,都是通过日志信息更改bug!日志最基本的功能就是发现和定位问题(找bug),我们还可以通过日志实现一下功能:记录用户登入信息日志,可以分析用户是否正常登入还是恶意破解用户!记录系统操作日志,方便数据恢复和定位问题!记录程序运行时间,方便后续程序优化进行数据支持!我们可以将日志类比于游戏存档,当你玩游戏,突然手机关机了,当你...

日志文件作用

日志是程序的重要组成部分,我们通常情况下程序出现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");
    }
}

在这里插入图片描述
在浏览器访问这个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

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

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

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

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

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

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

永久化存储日志

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

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

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

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

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

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

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

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

在这里插入图片描述

如果我们不指定保存的路径,系统会保存在这个项目中的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";
    }
}


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

lombok框架注解

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

注解实现原理

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

源文件

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。