目录
日志的作用
日志是程序的重要组成部分,如果程序报错,我们就需要查看日志来找到报错的原因。
- 记录错误日志和警告日志,方便以后发现和定位程序的问题位置
- 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户
- 记录系统的操作日志,方便恢复数据和定位操作人
- 记录程序的执行时间,方便为以后优化程序提供支持
怎么使用日志
- spring boot内置了日志框架SLF4J + logback
- 默认输出的日志并不是开发者定义和打印的,开发者如何自定义打印日志
- 日志默认打印在控制台上,不能被保存,如何把日志永久的保存下来。
常见的日志框架说明
自定义日志打印
- 在程序中的得到日志对象
- 使用日志对象提供的方法打印日志
1. 在程序中的得到日志对象
一个日志对象只会属于一个类,每个类都有自己独有的日志,因此应该用 private 修饰,应该是静态的static,不希望在其他地方被改变的 finally。
import org.slf4j.Logger;
private static final Logger log = LoggerFactory.getLogger(TestController.class);
注意不要选错
2. 使用日志对象提供的方法打印日志
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
@ResponseBody
public class TestController {
//1. 得到日志对象
//一个日志对象只会属于一个类,每个类都有自己独有的日志,因此应该用 private 修饰,应该是静态的,不希望在其他地方被改变的
private static final Logger log = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/sayHi") // = @WebServlet("/url") localhost:8080/sayHi
public String sayHi() {
// 打印日志
log.trace("i an trace"); //所有级别都打印
log.debug("i am debug"); //打印调试级别
log.info("i am info");
log.warn("i am warn");
log.error("i am error");
return "hello world"; //默认返回名为hello world的页面,
}
}
日志格式
日志级别
日志级别可以帮助我们筛选出重要的信息。
可以控制不同环境下,所需要的不同的日志
日志级别:
- trace:微量,少许的意思,级别最低
- debug:需要调试时的关键信息打印
- info:普通的打印信息(默认日志级别)
- warn:警告,不影响使用
- error:错误信息,级别较高的错误日志信息
- fatal:致命的,因为代码异常导致程序退出执行,级别最高,没有办法调用的
trace < debug < info < warn < error < fatal
设置了 warn 就只能收到 warn、error、fatal 级别的日志。低于warn的就不会输出。
级别设置
在配置文件中设置logging.level 配置项即可
其他的文件设置日志级别为error,在com.example.demo下设置日志级别为trace
# 日志级别设置
# 非常灵活,可以精确到某一个文件夹
logging:
level:
root: error
com:
example:
demo: trace
日志持久化
上面的日志都是输出在控制台的,在生产环境中,需要将日志保存下来,也就是持久化。
想将日志持久化,只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名之后,Spring Boot 就会将控制台的日志写到相应的目录或文件下了。
spring boot日志持久化的方法(保存日志)
- 设置日志的保存路径 或
- 设置日志的保存名称
设置日志的保存路径
# 日志保存路径
# 1. 尽量不要将保存的日志放在系统盘(C盘)
# 2. 路径中不要出现中文和空格
logging:
file:
path: E:\\java\\java-learning\\5.EE\\
日志文件一旦产生,日志文件及其内容就会永久的保存,不会因为重启或停掉项目而出现文件和内容的丢失
设置日志的保存名称
不设置地址,只写名称的话,就会放在项目的路径下。
logging:
file:
name: E:\\java\\java-learning\\5.EE\\spring-1.log
生产级别日志分类:具体还是要根据业务场景来确定
- 程序运行日志(存放在文件中)
- 业务日志(存放到数据库)
日志的默认最大大小为10MB(也可以自己设置),当超过最大大小时,就会新建一个日志文件存储。
更简单的日志输出: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 LoginController {
@RequestMapping("/log/sayHi")
public String sayHi() {
log.error("this is Slf4j log error");
log.info("this is Slf4j log info");
return "login 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 |
lombok原理解释
Java程序运行原理
Lombok作用
Lombok不是运行期的框架,而是编译期的框架
Lombok是在Java代码变成class代码的时候,把Lombok注解所对应的Java代码生成字节码。
查看target下的LoginController