日志

在Spring Boot生态中,为Java Util Logging 、Log4J2 和Logback 这些常见的日志框架都提供了自动化配置组件,每种Logger都可以通过配置在控制台或者文件中输出日志内容。默认情况下SpringBoot会使用Logback来实现日志管理。
一、如何记日志
首先,在代码层面,我们不纠结到底用默认的Logback还是Log4j,而是直接用:Slf4j。
为什么不用管具体用Logback还是Log4j,就可以去写代码呢?Slf4j:英文全称:Simple Logging Facade for Java,即:简单日志门面,它并不是一个具体的日志解决方案,实际工作的还是Logback或Log4j这样的日志框架。Slf4j就是23种设计模式中门面模式的典型应用案例。通过Slf4j这样一个门面的抽象存在,让我们在写代码时,只依赖这个抽象的日志操作,而具体的实现会在Slf4j门面调用的时候委托给具体的实现。

日志(log)作用

编程期调试代码
运营期记录信息
记录日常运营重要信息(峰值流量、平均响应时长 •••)
记录应用报错信息(错误堆栈)
记录运维过程数据(扩容、宕机、报警•••)

日志级别

TRACE:运行堆栈信息,使用率低
DEBUG: 程序员调试代码使用
INFO:记录运维过程数据
WARN:记录运维过程报警数据
ERROR:记录错误堆栈信息
FATAL:灾难信息,合并计入ERROR

我们在代码使用Logger打印不同级别的日志

  1. package com.xuezhi.baseController;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.*;
  6. @Controller
  7. public class BasicController {
  8. // 创建记录日志的对象
  9. private static final Logger log = LoggerFactory.getLogger(BasicController.class);
  10. @GetMapping("hello")
  11. public void hello(){
  12. log.debug("debug------");
  13. log.info("info------");
  14. log.warn("warn------");
  15. log.error("error------");
  16. }
  17. }

在yaml中或者通过启动参数 控制输出日志的级别。
root:设置所有包的日志级别
com.xuezhi.BaseController: 自定义指定包下的日志级别 但是一个个包这么设置太麻烦了,不方便维护
我们可以创建分组,然后对每个组设置日志级别

  1. # 开后debug 模式,输出调试信息,常用于检查系统运行状况 只是与boot有关的
  2. #debug: true
  3. # 设置日志级别,root 表示根节点,即整体应用日志级别 所有包
  4. logging:
  5. # 设置分组
  6. group:
  7. g1: com.xuezhi.baseController,com.xuezhi.service,com.xuezhi.dao
  8. g2: com.apple
  9. level:
  10. root: info
  11. # 设置某个包的日志级别
  12. com.xuezhi.baseController: info
  13. # 设置分组对某个组设置日志级别
  14. g1: debug

1.日志用于记录开发调试与运维过程消息
2.日志的级别共6种,通常使用4种即可,分别是DEBUG, INFO, WARN, ERROR
3.可以通过日志组或代码包的形式进行日志显示级别的控制

快速创建日志对象

上一章我们发现创建Logger日志对象,每次都需要手动创建,lombok给我们提供了@Slf4j�注解,在类上使用即可,日志对象 为 log

  1. package com.xuezhi.baseController;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.web.bind.annotation.*;
  7. @Slf4j
  8. @Controller
  9. public class BasicController {
  10. @GetMapping("hello")
  11. public String hello(){
  12. log.debug("debug------");
  13. log.info("info------");
  14. log.warn("warn------");
  15. log.error("error------");
  16. return "";
  17. }
  18. }

日志格式

类名如果太长则采用缩略形式
image.png
我们可以通过logging.pattern.console 设置日志的输出格式
%d:日期
%m:消息
%n:换行
%p: 日志级别 ,一般写成 %5p 代表占用5个长度
%clr: 添加颜色,给谁加,就放到谁身上 ,比如 %clr(%5p)。也可以指定颜色只需要在后面写{}即可把颜色写到大括号里面 %clr(cyan),这个颜色不是随便写什么颜色都可以用的,blue cyan faint green magenta red yellow只支持这六中
PID是boot给重写的我们日志没有办法直接获取,放过他
%t: 线程名 boot默认站位16位,我们也可以写成 %16t
%c:类名 %40c:占用40位, %-40c:采用左对齐,%-40.40c: 如果超过40位则截取成40位,%clr(%-40.40c){cyan}

  1. # 开后debug 模式,输出调试信息,常用于检查系统运行状况 只是与boot有关的
  2. #debug: true
  3. # 设置日志级别,root 表示根节点,即整体应用日志级别 所有包
  4. logging:
  5. # 设置分组
  6. group:
  7. g1: com.xuezhi.baseController,com.xuezhi.service,com.xuezhi.dao
  8. g2: com.apple
  9. level:
  10. root: info
  11. # 设置某个包的日志级别
  12. # com.xuezhi.baseController: info
  13. # 设置分组对某个组设置日志级别
  14. g1: debug
  15. pattern:
  16. console: "%d %clr(%5p) ---[%16t] %clr(%-40.40c){cyan} :%m %n"

总之天下公司一大抄,你抄我我抄你,如果让你搞日志,你就抄

日志文件

项目上线之后是没有idea控制台给你打印日志的,日志需要打印在日志文件中,但是所有的日志都存在同一个文件中那就太可怕了,所以我们可以设置滚动日志,设置 日志文件的大小,超出这个大小则再生成一个新的日志文件

  1. # 开后debug 模式,输出调试信息,常用于检查系统运行状况 只是与boot有关的
  2. #debug: true
  3. # 设置日志级别,root 表示根节点,即整体应用日志级别 所有包
  4. logging:
  5. # 设置分组
  6. group:
  7. g1: com.xuezhi.baseController,com.xuezhi.service,com.xuezhi.dao
  8. g2: com.apple
  9. level:
  10. root: info
  11. # 设置某个包的日志级别
  12. # com.xuezhi.baseController: info
  13. # 设置分组对某个组设置日志级别
  14. g1: debug
  15. pattern:
  16. console: "%d %clr(%5p) ---[%16t] %clr(%-40.40c){cyan} :%m %n"
  17. # 设置日志文件
  18. file:
  19. name: server.log
  20. logback:
  21. rollingpolicy:
  22. # 设置日志文件的大小,如果日志文件太大电脑就打不开了,window默认40G,这里为了方便演示设置4KB
  23. max-file-size: 4KB
  24. # 如果超过指定大小,自动创建日志文件的名字格式
  25. file-name-pattern: server.%d.%i. log