
目录
关于日志
我们日常在写代码的时候,出现了异常,都会在编译器的控制台上,找出问题。这些问题并不是我们盲猜的,而是控制台上有明显的日志打印,我们就可以根据日志打印发现问题、解决问题。所以说,日志是调试程序重要的一环。
此外,日志除了发现和定位问题外,它还有如下实用的功能:
- 记录用户登录日志, 方便分析用户是正常登录还是恶意破解用户。
 - 记录系统的操作日志,方便数据恢复和定位操作人。
 - 记录程序的执行时间, 方便为以后优化程序提供数据支持。
 
基于上面的介绍,本篇博客着重介绍 Spring Boot 提供的日志框架。
Spring Boot 日志的格式说明
我们发现在启动Spring Boot项目的时候,默认就有日志输出

 因为Spring Boot内置了日志框架SLF4J与logback,默认的日志是打印在控制台上的
那么,这些日志信息是什么意思呢?请看下图:

自定义打印日志
- 得到日志对象(
每个类都有自己的日志对象) - 使用日志对象提供的方法打印日志
 
@Controller
@ResponseBody  //加在类上, 表示当前类中的所有方法返回的都是非静态页面的数据
public class TestController {
    private static final Logger log = LoggerFactory.getLogger(TestController.class);
    @RequestMapping ("/sayHi")   // = WebServlet("/URL")
    public String sayHi() {
        log.trace("i'm trace");
        log.warn("i'm warn");
        log.debug("i'm debug");
        log.info("i'm info");
        log.error("i'm error");
        return "hello world ";
    }
}
 
打印结果:

 发现只打印了info,warn和error,因为日志的默认级别是info,只能打印它与比它更大级别的日志,trace和dubug的级别不够
日志级别
日志级别可以帮助我们筛选信息,从而节省程序员筛选日志的时间,日志级别可以控制不同环境下,打印日志的详细程度,如开发环境我们需要详细的日志信息,而线上环境我们为了性能,就打印少量的日志
- trace:
级别最低 - debug:调试级别的,常用于跟踪程序的进展
 - info:普通的打印信息(默认的日志级别)
 - warn:警告级别,不影响使用,但应该注意
 - error:错误级别,错误日志信息打印
 - fatal:致命级别,因代码异常导致程序退出,
级别最高 
六种日志级别,由低到高,越往级别高的日志,接收到的信息越少。
比方说:
当你的日志级别设置为 info 的时候,你只能看到 info、warn、error、fatal.
 当你的日志级别设置为 error 的时候,你只能看到 error、fatal.
这很好理解,假设你的项目出现了异常,那么它优先显示错误的日志,因为正常的数据信息与你无关,你也不会对正常的代码进行排查。

那如何设置日志的打印级别呢?
在配置文件里,添加系统配置项 logging.level (application.properties配置文件写法)
logging:
    level:
      #设置全局的日志级别
      root: error
      #指定包下的日志打印级别
      com.example.demo: warn 
 

日志持久化
上面的日志打印都只是打印在控制台,但是线上我们一般都把日志持久化到文件中,以此方便日后排查问题
日志持久化保存有以下两种方式:
- 设置日志的保存路径
 - 设置日志的保存名称
 
# 设置日志持久化保存的目录
logging:
  file:
    path: D:\\log
 
# 设置日志持久化保存的文件名称
logging:
  file:
    name: D:\\log\\springboot.log
 
运行程序后,会在本地生成一个日志文件,该日志文件是追加写的方式,即重启程序时,日志内容不会消失,也不会覆盖,而是追加写

 日志文件的大小默认是10MB,如果超过此大小,会重新创建一个文件保存新日志,可以通过系统配置项来设置这个文件的大小
# 设置日志文件大小的最大值
logging:
  logback:
    rollingpolicy:
      max-file-size: 50MB
 
利用 lombok 来做到更简单的日志输出
每次都使用LoggerFactory.getLogger(xxx.class) 获取日志对象,然后使用对象调用方法比较繁琐,因为每个类都要进行相同的操作,我们可以简化上述操作,使用如下操作方式:
- 添加
lombok依赖 
可以通过前面介绍的插件EditStarters添加lombok依赖,也可以手动添加
<dependency>
<groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <version>1.18.20</version>
 <optional>true</optional>
</dependency>
 
- 在类上添加 
@Slf4j注解后,在类中就可以直接使用log对象 
@Slf4j
public class LogController {
    public void writeLog(){
        log.info("write log"); //添加注解后,就有了log对象
    }
}
 
 
Java 程序的运行原理:
Lombok 的作用如下图所示:

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 | 











