
1.日志概述
1.1 为什么要学习日志
1.2 日志的用途
通过前面的学习,我们知道日志主要是为了发现问题,分析问题,定位问题 的,但除此之外,日志还有很多用途。

下图中的数据源,其中一部分就来自于日志记录的数据。


2.日志使用
Spring Boot 项目在启动的时候默认就有日志输出,如下图所示:

它打印的日志和 System.out.print 有什么不同呢?
java
@RestController
public class LoggerController {
@RequestMapping("/logger")
public String logger(){
System.out.println("打印⽇志");
return "打印⽇志";
}
}
**运行程序,调用接口(去网页刷新一下),打印日志,**观察日志输出。 
可以看到,我们通过System.out.print 打印的日志,比SpringBoot 打印的日志缺少了很多信息。
SpringBoot 内置了日志框架 Slf4j ,我们可以直接在程序中调用 Slf4j 来输出日志。
2.1 打印日志
打印日志的步骤:先****在程序中得到日志对象,再使用日志对象输出要打印的内容。
(1)在程序中得到日志对象
在程序中获取日志对象需要使用日志工厂 LoggerFactory,如下代码所示:

java
private static Logger logger =
LoggerFactory.getLogger(LoggerController.class);
LoggerFactory.getLogger 需要传递一个参数, 标识这个⽇志的名称,这样可以更清晰的知道是**哪个类 输出的日志,**当有问题时,可以更方便直观的定位到问题类。
注意:Logger 对象是属于 org.slf4j 包下的,不要导入错包。

(2)使用日志对象打印日志
日志对象的打印方法有很多种,我们可以先使用 info() 方法来输出日志。
java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;、
@RestController
public class LoggerController {
private static Logger logger =
LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/logger")
public String logger(){
logger.info("--------------要输出⽇志的内容----------------");
return "打印⽇志";
}
}
打印日志效果展示:

2.2 日志框架介绍(了解)

SLF4J不同于其他日志框架,它不是一个 真正的日志实现,而是一个抽象层, 对日志框架制定的一种规范、标准、接口 ,所有SLF4J并不能 独立使用,需要和具体的日志框架配合使用。
(1)门面模式(外观模式)


门面模式的实现
**场景:**回家,我们会开各个屋的灯;离开家时,会关闭各个屋的灯。
如果家里设置⼀个总开关来控制整个屋的灯就会很方便,我们使用门面模式的实现。
java
public class FacadePatternDemo {
public static void main(String[] args) {
LightFacade lightFacade = new LightFacade();
lightFacade.lightOn();
}
}
/**
* 灯的⻔⾯
*/
class LightFacade{
private Light livingRoomLight = new LivingRoomLight();
private Light hallLight = new HallLight();
private Light diningLight = new DiningLight();
public void lightOn(){
livingRoomLight.on();
hallLight.on();
diningLight.on();
}
public void lightOff(){
livingRoomLight.off();
hallLight.off();
diningLight.off();
}
}
//灯
interface Light {
void on();
void off();
}
/**
* 客厅灯
*/
class LivingRoomLight implements Light{
@Override
public void on() {
System.out.println("打开客厅灯");
}
@Override
public void off() {
System.out.println("关闭客厅灯");
}
}
/**
* ⾛廊灯
*/
class HallLight implements Light{
@Override
public void on() {
System.out.println("打开⾛廊灯");
}
@Override
public void off() {
System.out.println("关闭⾛廊灯");
}
}
/**
* 餐厅灯
*/
class DiningLight implements Light{
@Override
public void on() {
System.out.println("打开餐厅灯");
}
@Override
public void off() {
System.out.println("关闭餐厅灯");
}
}

(2)SLF4J框架介绍
SLF4J就是其他日志框架的门面, 可以理解为是**提供日志服务的统一API接口,**并不涉及到具体的日志逻辑实现。
不引入日志文件

引入日志文件

SLF4J 就是这个日志门面 ,SLF4J使你的代码独立于 任意⼀个特定的日志API,这是⼀个对于开发API的开发者很好的思想。
2.3 日志格式的说明

2.4 日志级别

(1)分类


(2)使用
日志级别是开发人员自己设置 的,开发人员根据自己的理解来判断该信息的重要程度。(类似公司管理,通常由领导来判断什么样的事情需要汇报,什么样的事情不需要汇报。)
针对这些级别,Logger对象 分别提供了对应的方法来输出日志。
java
/**
* 打印不同级别的⽇志
* @return
*/
@RequestMapping("/printLog")
public String printLog() {
logger.trace("================= trace ===============");
logger.debug("================= debug ===============");
logger.info("================= info ===============");
logger.warn("================= warn ===============");
logger.error("================= error ===============");
return "打印不同级别的⽇志" ;
}

若是想改变 日志的默认输出级别 ,就需要进行日志级别配置,只需要在配置文件中设置 "logging.level " 配置项即可,root 代表根目录 ,如果想在某个单独的目录中修改 ,只需要在 root 后面加上具体的目录以及级别。

【properties 和 yml 只需要配置其中一个即可,二 者转换方式-- Properties 文件的点( . ) 对应 yml 文件中的换行】
2.5 日志配置
后续的配置,properties 和 yml 只需要配置其中一个即可
(1)日志持久化
以上的日志都是输出在控制台 上的,然而在线上环境中,我们需要把日志保存 下来,以便出现问题之后追溯问题。(把日志保存下来就叫持久化)
日志持久化有两种方式



注意: logging.file.name 和logging.file.path 两个都 配置的情况下,只生效其一,以 logging.file.name为准。
(2)配置日志文件分割

Properties配置
java
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i
logging.logback.rollingpolicy.max-file-size=1KB
yml配置
java
logging:
logback:
rollingpolicy:
max-file-size: 1KB
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
1. 日志文件超过1KB就分割 (设置1KB是为了更好展示,企业开发通常设置为200M、500M等,此处没 有明确标准)
2. 分割后的日志文件名 为:日志名.日期.索引
(3)配置日志格式

配置项说明:



3.更简单的日志输出
每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,lombok 给我们提供了一种更简单的方式。
1. 添加 lombok 框架支持
2. 使用@slf4j 注解输出日志。
添加 lombok 依赖
java
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
输出日志
java
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LogController {
public void log(){
log.info("--------------要输出⽇志的内容----------------");
}
}
lombok 提供的 @Slf4j 会帮我们提供一个日志对象 log ,我们直接使用就可以。


