目录
一、日志的用途
二、日志的使用
1.打印日志
2.在程序中得到日志对象
3.使用日志对象打印日志
4.日志格式说明
5.日志框架的了解
门面模式(外观模式)
6.日志级别
7.日志配置
配置日志级别
日志持久化
配置日志文件分割
配置日志格式
三、更简单的日志输出
1.添加lombok依赖
2.添加@Slf4j注解
一、日志的用途
1.在项目中用于定位问题和发现问题
2.系统监控:
我们可以通过日志记录这个系统的运行状态,比如每一个方法的响应时间,响应状态,对数据进行分析,设置不同的规则等等。
3.数据采集:
数据采集是一个比较大的范围,采集的数据可以作用在很多方面,比如数据统计,推荐排序等。
4.日志审计:
通过设置系统日志分析,可以判断一些非法攻击,非法调用,以及系统处理过程中的安全 隐患。
二、日志的使用
1.打印日志
打印日志的步骤:
- 在程序中得到日志对象
- 使用日志对象输出要打印的内容
2.在程序中得到日志对象
获取日志对象需要使用日志工厂LoggerFactory,如下代码所示:
private static Logger logger = LoggerFactory.getLogger(BookController.class);
其中LoggerFactory.getLogger需要传递一个参数,标识这个日志对象的名称,这样可以更清晰的知道哪个类输出的日志,当遇到问题是就可以定位到时那个类出了问题了。
注意:Logger对象是属于org.slf4j包下的,不要导错包了。
3.使用日志对象打印日志
日志对象的打印方法有很多种,这里使用的是info()方法来进行打印:
private static Logger logger = LoggerFactory.getLogger(BookController.class);@RequestMapping("/logger")public String logger(){logger.info("====================日志打印输出===================");return "打印日志";}
可以看到这是BookController类打印的日志。
4.日志格式说明
从上图可以看到,日志输出的内容元素具体如下:
- 时间日期:精确到秒
- 日志级别:ERROR,WARN,INFO,DEBUG或TRACE
- 进程ID
- 线程名
- Logger名(通常使用源代码的类名)
- 日志内容
5.日志框架的了解
日志框架主要是由日志门面和日志实现构成的。
SLF4J不同于其他日志框架,它不是一个真正的日志实现,而是一个抽象层,对日志框架制定的一种规范,标准,接口。所有SLF4J并不能独立使用,需要和具体的日志框架配置使用。
门面模式(外观模式)
SLF4J是门面模式的典型应用(但不仅仅使用了门面模式)。
门面模式定义
门面模式(Facade Pattern)又称为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征定义了一个高层接口,让子系统更容易使用。
门面模式包含了两个角色:
外观角色:也称门面角色,系统对外的统一接口。
子系统角色:可以同时有一个或多个子系统,每个子系统都不是一个单独的类,而是一个类的集合。
比如:家里有很多灯,每次回家都要一盏一盏的开,但是有了总开关,只要打开总开关,就可以一次性全部打开了。
门面模式优点
- 减少了系统的相互依赖,实现了客户端与子系统的解耦关系;
- 提高了灵活性,简化了客户端对子系统的使用难度(如SLF4J封装了Logback、Log4j2等实现,开发者只需调用Logger.info(),无需关心底层如何输出日志);
- 提高了安全性,可以灵活设定访问权限。
6.日志级别
日志级别代表着日志信息对应问题的严重性,同时是为了更快的筛选符合目标的日志信息。
日志级别分为下面几类:
- FATAL:致命信息,表示需要立即被处理的系统级错误。
- ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行。
- WARN:警告信息,不影响使用,但需要注意的问题。
- INFO:普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成。
- DEBUG:调试信息,需要调试时关键信息的打印。
- TRACE:追踪信息,比DEBUG更细粒度的信息事件。
日志级别的顺序:
日志级别与日志配置有关,而Spring日志的默认输出级别是info级别的,普通日志输出时,只会打印级别大于或等于此级别的日志。
7.日志配置
配置日志级别
日志级别只需要在配置文件中设置“logging.level”配置项即可。
properties配置
logging.level.root=debug
yml配置
logging:level:root: debug
重新运行代码后,查看结果:
日志持久化
有时候我们需要报日志保存下来,以便出现问题之后追溯问题,把日志保存下来就叫做持久化。
使用日志持久化的方式有两种:
- 配置日志文件名
- 配置日志的存储目录
配置日志文件的路径和文件名:
properties配置
- 文件名保存
logging.file.name=logger/springboot.log
- 路径保存
logging.file.path=D:/temp
yml配置
- 文件名保存
设置⽇志⽂件的⽂件名
logging:file:name: logger/springboot.log
- 路径保存
# 设置⽇志⽂件的⽬录
logging:file:path: D:/temp
配置完后,运行程序,日志的内容被我们保存在了对应的目录下:
- 本项目目录下:
- 其他目录下:
配置日志文件分割
如果我们的日志都放在一个文件中,随着项目的运行,日志文件会越来越大,需要对日志文件进行分割。
所以我们可以通过配置日志文件的大小来进行分割。
配置项 | 说明 | 默认值 |
logging.logback.rollingpolicy.file-name-pattern | 日志分割后的文件名格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
logging.logback.rollingpolicy.max-file-size | 当日志文件超过这个大小就会自动分割 | 10MB |
配置日志文件分割:
properties配置
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i
logging.logback.rollingpolicy.max-file-size=1KB
yml配置
logging:logback:rollingpolicy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
项目运行后,查看结果:
配置日志格式
目前日志打印的格式是默认的
打印日志的格式,也是支持配置的,支持控制台和日志文件分别设置
配置项 | 说明 | 默认值 |
logging.pattern.console | 控制台日志格式 | %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx} |
logging.pattern.file | 日志文件的日志格式 | %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MMdd'T'HH:mm:ss.SSSXXX}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx} |
配置项说明:
1.%clr(表达式)(颜色)设置输入日志的颜色
支持颜色有以下几种:
- blue
- cyan
- faint
- green
- magenta
- red
- yellow
2.%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} ⽇期和时间--精确到毫秒
3.%5p显式日志级别
4.%t线程名,%c类的全限定名。%M method,%L 为行号,%thread线程名称,%m或者%msg显示输出消息。%n换行符。
、更多说明, 参考: https://logback.qos.ch/manual/layouts.html#conversionWord
例子:
properties配置
logging.pattern.console='%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
yml配置
logging:pattern:console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
项⽬运⾏, 观察⽇志变化:
三、更简单的日志输出
每次从日志工厂里获取日志对象(LoggerFactory.getLogger(xxx.class)很繁琐,且每一个类都要添加以便,所以lombok给我们提供了更简单的方式。
- 添加lombok框架支持
- 使用@Slf4j注释输出日志
1.添加lombok依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
2.添加@Slf4j注解
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,我们可以直接使用就可以了。