您现在的位置是:首页 >技术教程 >SpringBoot 日志文件网站首页技术教程
SpringBoot 日志文件
?“种一棵树最好的时间是十年前,其次是现在”
日志怎么用?
Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所示:
以上内容就是 Spring Boot 输出的控制台⽇志信息。
通过上述⽇志信息我们能发现:
Spring Boot 内置了⽇志框架。
默认情况下,输出的⽇志并⾮是开发者定义和打印的,那开发者怎么在程序中⾃定义打印⽇志呢?
⽇志默认是打印在控制台上的,⽽控制台的⽇志是不能被保存的,那么怎么把⽇志永久的保存下来呢?
常见的日志框架:
门面模式也是设计模式之一。
SpringBoot 之所以能够打印日志,是因为内置了 SLF4J + logback.
日志门面的作用就是为了方便后期可以无感知的切换其他的日志框架。
自定义日志打印
得到日志对象
每个类有自己的日志对象。
//1.得到日志对象
private static final Logger log = LoggerFactory.getLogger(TestController.class);
- 此处演示 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 -> ";
}
但是打印日志只有 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";
}
}
日志级别
分类
⽇志的级别分为:
trace:微量,少许的意思,级别最低;
debug:需要调试时候的关键信息打印;
info:普通的打印信息(默认⽇志级别);
warn:警告,不影响使⽤,但需要注意的问题;
error:错误信息,级别较⾼的错误⽇志信息;
fatal:致命的,因为代码异常导致程序退出执⾏的事件。
日志级别的顺序从低到高是:trace, debug, info, warn, error, fatal.
比如设置了级别是 warn, 就只能收到 warn, error, fatal 级别的日志了。
虽然日志有 6 种,但是 我们只能操作前五种, fatal 操作不了。
日志级别设置
logging:
level:
root: error
配置根路径的⽇志级别。
如果我想设置 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 -> ";
}
}
日志持久化
持久化:保存下来。
想要将⽇志进⾏持久化,只需要在配置⽂件中指定⽇志的存储⽬录或者是指定⽇志保存⽂件名之后, Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下了。
1)配置⽇志⽂件的保存路径:
在 application-dev.yml 文件里写
#日志保存路径 (不要把保存的盘符写在 C 盘,路径中不要有中文或空格 )
logging:
file:
path: D:\home\
问题:
1.我把项目关闭,再重新运行,会不会再新增一个日志文件?
2.如果没有新增文件,那么再次运行时 spring.log 文件里之前的日志是否还在,还是被覆盖了?
答案是:
1.没有新增新的 log 文件
2.旧的日志内容还在
如果我再一次去访问 localhost:7666/sayhi 这个网址,又会去写日志,那么这个日志是会在原有日志文件内容覆盖还是追加?
答:是追加。
观察得出结论:
日志文件一旦产生,那么日志文件及其内容就会永久保存,不会出现文件或内容的丢失,无论任何操作都会保持以上特性。
2)配置⽇志⽂件的⽂件名:
logging:
file:
name: springboot.log
运行 springBoot, 访问 localhost:7666/sayhi
此时 日志文件是保存在 当前项目路径下。
如果我想把这个文件放到一个指定位置?
logging:
file:
name: D:\home\springboot.log
日志信息支持中文
生产级别日志分类:
1.程序运行日志(存放在文件中)
2.业务日志(存放在数据库中)
根据业务场景来定。
日志是一直追加的,那随着时间的推移,日志内容越来越多,怎么处理这个问题?
Common Application Properties (spring.io)
当文件大小超过了 10MB ,就会去建一个新的文件(这时新增的文件名是在原名称后面加"-x")。
更简单的日志输出—lombok
每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦,可以使⽤ lombok 来更简单的输出。
- 添加 lombok 框架⽀持。
- 使⽤ @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 ";
}
}
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 |
lombok 是在 编译期间 起作用的。
target 为项⽬最终执⾏的代码,查看 target ⽬录 如下: