您现在的位置是:首页 >技术教程 >SpringBoot 日志文件网站首页技术教程

SpringBoot 日志文件

银河罐头 2024-06-22 18:01:02
简介SpringBoot 日志文件

✏️作者:银河罐头
?系列专栏:JavaEE

?“种一棵树最好的时间是十年前,其次是现在”

日志怎么用?

Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所示:

image-20230523204401186

以上内容就是 Spring Boot 输出的控制台⽇志信息。

通过上述⽇志信息我们能发现:

Spring Boot 内置了⽇志框架。

默认情况下,输出的⽇志并⾮是开发者定义和打印的,那开发者怎么在程序中⾃定义打印⽇志呢?

⽇志默认是打印在控制台上的,⽽控制台的⽇志是不能被保存的,那么怎么把⽇志永久的保存下来呢?

常见的日志框架:

image-20230523205737217

门面模式也是设计模式之一。

SpringBoot 之所以能够打印日志,是因为内置了 SLF4J + logback.

日志门面的作用就是为了方便后期可以无感知的切换其他的日志框架。

自定义日志打印

得到日志对象

每个类有自己的日志对象。

image-20230524095540988

//1.得到日志对象
private static final Logger log = LoggerFactory.getLogger(TestController.class);

image-20230524160448972

  • 此处演示 getLogger() 传 Class<?> clazz;

使用日志对象提供的方法打印

@RequestMapping("/sayhi") // = @WebServlet("/url")  localhost:8080/sayhi
    public String sayHi() {
        log.trace("i'm trace");
        log.debug("i'm debug");
        log.info("i'm info");
        log.warn("i'm warn");
        log.error("i'm error");
        return "hello world -> ";
    }

image-20230524155912621

但是打印日志只有 3 个?

日志默认是 info 级别,只能是大于等于 info 级别的才能看到。

  • 此处演示 getLogger() 传 String name;
package com.example.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController //=@ResponseBody + Controller 返回非静态页面的数据
public class StudentController {
    private static final Logger logger = LoggerFactory.getLogger("StudentController");
    @RequestMapping("/stu/sayhi")
    public String sayhi(){
        logger.info("student info");
        logger.error("student error");
        return "student say hi";
    }
}

image-20230524160923603

日志级别

分类

⽇志的级别分为:

trace:微量,少许的意思,级别最低;

debug:需要调试时候的关键信息打印;

info:普通的打印信息(默认⽇志级别);

warn:警告,不影响使⽤,但需要注意的问题;

error:错误信息,级别较⾼的错误⽇志信息;

fatal:致命的,因为代码异常导致程序退出执⾏的事件。

日志级别的顺序从低到高是:trace, debug, info, warn, error, fatal.

比如设置了级别是 warn, 就只能收到 warn, error, fatal 级别的日志了。

虽然日志有 6 种,但是 我们只能操作前五种, fatal 操作不了。

image-20230524161511780

日志级别设置

logging:
  level:
    root: error

配置根路径的⽇志级别。

image-20230524162033504

如果我想设置 demo 文件夹底下的 controller 文件夹里所有日志默认级别是 trace

#日志级别设置
logging:
  level:
    root: error
    com:
      example:
        demo:
          controller: trace
@Controller
@ResponseBody 
public class TestController {
    //1.得到日志对象
    private static final Logger log = LoggerFactory.getLogger(TestController.class);

    @RequestMapping("/sayhi") 
    public String sayHi() {
        log.trace("i'm trace");
        log.debug("i'm debug");
        log.info("i'm info");
        log.warn("i'm warn");
        log.error("i'm error");
        return "hello world -> ";
    }
}

image-20230524163208853

image-20230524163324394

日志持久化

持久化:保存下来。

想要将⽇志进⾏持久化,只需要在配置⽂件中指定⽇志的存储⽬录或者是指定⽇志保存⽂件名之后, Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下了。

1)配置⽇志⽂件的保存路径:

在 application-dev.yml 文件里写

#日志保存路径 (不要把保存的盘符写在 C 盘,路径中不要有中文或空格 )
logging:
  file:
    path: D:\home\

image-20230524180202710

image-20230524180250477

image-20230524180338242

问题:

1.我把项目关闭,再重新运行,会不会再新增一个日志文件?

2.如果没有新增文件,那么再次运行时 spring.log 文件里之前的日志是否还在,还是被覆盖了?

答案是:

1.没有新增新的 log 文件

2.旧的日志内容还在

如果我再一次去访问 localhost:7666/sayhi 这个网址,又会去写日志,那么这个日志是会在原有日志文件内容覆盖还是追加?

答:是追加。

image-20230524181218511

观察得出结论:

日志文件一旦产生,那么日志文件及其内容就会永久保存,不会出现文件或内容的丢失,无论任何操作都会保持以上特性。

2)配置⽇志⽂件的⽂件名:

logging:
  file:
    name: springboot.log

运行 springBoot, 访问 localhost:7666/sayhi

image-20230524182222260

此时 日志文件是保存在 当前项目路径下。

如果我想把这个文件放到一个指定位置?

logging:
  file:
    name: D:\home\springboot.log

image-20230524184820878

日志信息支持中文

image-20230524185143281

生产级别日志分类:

1.程序运行日志(存放在文件中)

2.业务日志(存放在数据库中)

根据业务场景来定。

日志是一直追加的,那随着时间的推移,日志内容越来越多,怎么处理这个问题?

Common Application Properties (spring.io)

image-20230524190331902

当文件大小超过了 10MB ,就会去建一个新的文件(这时新增的文件名是在原名称后面加"-x")。

更简单的日志输出—lombok

每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦,可以使⽤ lombok 来更简单的输出。

  1. 添加 lombok 框架⽀持。
  2. 使⽤ @slf4j 注解输出⽇志。
package com.example.demo.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j //给当前类添加一个 log 的日志对象(= SLF4j 提供的 Logger 对象)
public class LogController {
    @RequestMapping("/log/sayhi")
    public String sayhi(){
        log.info("我是 log 的 info");
        log.error("我是 log 的 error");
        return " log sayhi ";
    }
}

image-20230524194447027

lombok 更多注解说明

基本注解

注解作⽤
@Getter⾃动添加 getter ⽅法
@Setter⾃动添加 setter ⽅法
@ToString⾃动添加 toString ⽅法
@EqualsAndHashCode⾃动添加 equals 和 hashCode ⽅法
@NoArgsConstructor⾃动添加⽆参构造⽅法
@AllArgsConstructor⾃动添加全属性构造⽅法,顺序按照属性的定义顺序
@NonNull属性不能为 null
@RequiredArgsConstructor⾃动添加必需属性的构造⽅法,final + @NonNull 的 属性为必需

组合注解

注解作⽤
@Data@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor +@NoArgsConstructor

⽇志注解

注解作⽤
@Slf4j添加⼀个名为 log 的⽇志,使⽤ slf4j

image-20230524200724039

lombok 是在 编译期间 起作用的。

target 为项⽬最终执⾏的代码,查看 target ⽬录 如下:

image-20230524201929298

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。