一.日志作用
1.定位和发现问题
这是日志的主要用途,通过查看日志,我们可以定位问题发生的位置,从而快速的发现问题,分析问题.
2.系统监控
监控几乎是一个成熟系统的标配,我们可以通过日志记录这个系统的运行状态,比如记录方法的响应时间,响应状态,通过设置不同的规则,超过阈值就进行报警.
3.数据采集
采集的数据可以作用在很多方面,比如数据统计,推荐排序.
- 数据统计:统计页面的浏览量,访客量,点击量
- 推荐排序:购物/广告/新闻等都设计到推荐排序,数据采集是推荐排序中必须要做的.
4.日志审计
安全审计是系统安全中非常重要的一部分. 通过系统日志分析,可以判断一些非法攻击/非法调用.
二.日志的使用
Spring Boot项目在启动的时候默认就有日志输出:
这个日志格式是这样的:
它比我们通过System.out.print打印的日志多了很多信息.
那我们怎么打印自己写的日志呢?
SpringBoot内置了日志框架Slf4j,我们可以在程序中调用Slf4j来输出日志.
三.日志框架
Slf4j不同于其他的日志框架,它不是一个真正的日志实现,而是一个对日志框架制定的一种规范,标准,接口. 所以Slf4j并不能独立使用,需要和具体的日志框架配合使用.
门面模式/外观模式
门面模式,提供了一个统一的接口,用来访问子系统中的一组接口,其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤.
Slf4j是门面模式的典型应用
门面模式的优点
1.减少了系统的相互依赖,实现了客户端和子系统的耦合关系
2.提高了灵活性,简化了客户端对子系统的使用难度
3.提高安全性.灵活设方法的定访问权限
四.SLF4J日志框架
Slf4j就相当于是其他日志框架的门面,可以理解为是提供⽇志服务的统⼀API接⼝
为什么要引入日志门面?
常见的日志框架有 log4j , logback , 一个程序常常需要不同的日志框架, 而不同的日志框架的API和配置文件不同, 如果多个日志框架共存,就要维护多套配置文件,而且如果更换日志框架,还必须修改代码 , 这个过程很容易产生冲突 .
而如果引入日志门面,应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架 实现), 此时应⽤程序只需要维护⼀套⽇志⽂件配置, 且当底层实现框架改变时, 也不需要更改应⽤程序代码.
Slf4j就是这个日志门面.
所以Slf4j不是一个真实的日志框架实现,是一个日志框架门面 , 具体实现是log4j/log4j/logback/jul
门面模式只是slf4j使用的一种设计模式 , 还有其他的设计模式.
打印⽇志的步骤
1. 在程序中得到⽇志对象.
在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory
2.使⽤⽇志对象输出要打印的内容
⽇志对象的打印⽅法有很多种,我们可以先使⽤ info() ⽅法来输出⽇志
日志格式
日志级别
⽇志级别代表着⽇志信息对应问题的严重性, 为了更快的筛选符合⽬标的⽇志信息.
⽇志的级别从⾼到低依次为 : FATAL、ERROR、WARN、INFO、DEBUG、TRACE
级别越⾼, 收到的消息越少
• FATAL: 致命信息,表⽰需要⽴即被处理的系统级错误.
• ERROR: 错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏.
• WARN: 警告信息, 不影响使⽤, 但需要注意的问题
• INFO: 普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息, 例如系统启动完成、请求处理完成等.
• DEBUG: 调试信息, 需要调试时候的关键信息打印.
• TRACE: 追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)
⽇志级别的使⽤
⽇志级别是开发⼈员⾃⼰设置的. 开发⼈员根据⾃⼰的理解来判断该信息的重要程度,类似公司管理, 通常由领导来判断什么样的事情需要汇报, 什么样的事情不需要汇报.
针对这些级别, Logger 对象分别提供了对应的⽅法, 来输出⽇志
日志对象名
通常使用源代码的类名 , 也可以自定义.
这里写了五种不同级别的日志信息
然而发现只打印了三条日志信息,debug和trace类型的并未打印.
这是由于日志的输出级别默认是info级别,所以只会打印⼤于等于此级别的⽇志, 也就 是info, warn和error.
配置成debug模式后
debug日志可以打印; 但是trace优先级比debug低,不能打印.
日志配置
这里以配置properties文件为例.
1设置日志的级别
logging.level.root: debug | 配置根目录下所有文件日志的级别 |
logging.level.包路径 :debug | 配置某个包下文件日志的级别 |
2设置颜色(idea)
第一步:打开Edit Configuration
第二步:添加这串
- -Dspring.output.ansi.enabled=ALWAYS
3日志持久化
数据保存在数据库中,是一种持久化的方式
日志保存在文件中,也是一种持久化的方式
这里是日志保存在文件中,有两种⽅式
1. 配置⽇志⽂件名
2. 配置⽇志的存储⽬录
logging.file.name | 可以是相对路径,也可以是绝对路径. 可以是路径+文件名/ 单独一个文件名(以当前目录作为基准目录) |
logging.file.path | 只能是目录 比如var/log |
注意: logging.file.name 和 logging.file.path 两个都配置的情况下, 只⽣效其⼀, 以 logging.file.name 为准.
比如将日志文件保存到aaa.log
4日志分割
修改日志格式
logging.pattern.console | 修改控制台的日志格式 |
logging.pattern.file | 修饰文件的日志格式 |
日志的简单写法
使用注解@Slf4j的方式
配置项 | 说明 | 默认值 |
logging.logback.rollingpolicy.fil e-name-pattern | ⽇志分割后的⽂件名 格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
logging.logback.rollingpolicy.m ax-file-size | ⽇志⽂件超过这个⼤ ⼩就⾃动分割 | 10MB |
5配置⽇志格式
打印⽇志的格式, 也是⽀持配置的. ⽀持控制台和⽇志⽂件分别设置
配置项 | 说明 | 默认值 |
logging.pattern.console | 控制台⽇ 志格式 | %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MMdd'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} |
注意需要简单配置一下, 让idea⽀持控制台颜⾊显⽰,参考第二点.
更简单的⽇志输出
由于每个类都要使用LoggerFactory获取日志对象,lombok给我们提供了 ⼀种更简单的⽅式.
1. 添加 lombok 框架⽀持
2. 使⽤ @slf4j 注解输出⽇志。
@slf4j会提供一个日志对象log,直接使用就可以 .