【Spring日志】

一.日志作用

1.定位和发现问题

这是日志的主要用途,通过查看日志,我们可以定位问题发生的位置,从而快速的发现问题,分析问题.

2.系统监控

监控几乎是一个成熟系统的标配,我们可以通过日志记录这个系统的运行状态,比如记录方法的响应时间,响应状态,通过设置不同的规则,超过阈值就进行报警.

3.数据采集

采集的数据可以作用在很多方面,比如数据统计,推荐排序.

  • 数据统计:统计页面的浏览量,访客量,点击量
  • 推荐排序:购物/广告/新闻等都设计到推荐排序,数据采集是推荐排序中必须要做的.

4.日志审计

安全审计是系统安全中非常重要的一部分. 通过系统日志分析,可以判断一些非法攻击/非法调用.

二.日志的使用

Spring Boot项目在启动的时候默认就有日志输出:

这个日志格式是这样的:

它比我们通过System.out.print打印的日志多了很多信息.

那我们怎么打印自己写的日志呢?

SpringBoot内置了日志框架Slf4j,我们可以在程序中调用Slf4j来输出日志.

三.日志框架

【Spring日志】_第1张图片

Slf4j不同于其他的日志框架,它不是一个真正的日志实现,而是一个对日志框架制定的一种规范,标准,接口. 所以Slf4j并不能独立使用,需要和具体的日志框架配合使用.


门面模式/外观模式

门面模式,提供了一个统一的接口,用来访问子系统中的一组接口,其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤.

Slf4j是门面模式的典型应用

门面模式的优点

1.减少了系统的相互依赖,实现了客户端和子系统的耦合关系

2.提高了灵活性,简化了客户端对子系统的使用难度

3.提高安全性.灵活设方法的定访问权限

四.SLF4J日志框架

Slf4j就相当于是其他日志框架的门面,可以理解为是提供⽇志服务的统⼀API接⼝

为什么要引入日志门面?

常见的日志框架有 log4j , logback , 一个程序常常需要不同的日志框架, 而不同的日志框架的API和配置文件不同, 如果多个日志框架共存,就要维护多套配置文件,而且如果更换日志框架,还必须修改代码 , 这个过程很容易产生冲突 .

而如果引入日志门面,应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架 实现), 此时应⽤程序只需要维护⼀套⽇志⽂件配置, 且当底层实现框架改变时, 也不需要更改应⽤程序代码.

Slf4j就是这个日志门面.

所以Slf4j不是一个真实的日志框架实现,是一个日志框架门面 , 具体实现是log4j/log4j/logback/jul 

门面模式只是slf4j使用的一种设计模式 , 还有其他的设计模式.

打印⽇志的步骤

1. 在程序中得到⽇志对象.

在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory

2.使⽤⽇志对象输出要打印的内容

⽇志对象的打印⽅法有很多种,我们可以先使⽤ info() ⽅法来输出⽇志

【Spring日志】_第2张图片

日志格式

日志级别

⽇志级别代表着⽇志信息对应问题的严重性, 为了更快的筛选符合⽬标的⽇志信息.

⽇志的级别从⾼到低依次为 : FATAL、ERROR、WARN、INFO、DEBUG、TRACE

级别越⾼, 收到的消息越少

• FATAL: 致命信息,表⽰需要⽴即被处理的系统级错误.

• ERROR: 错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏.

• WARN: 警告信息, 不影响使⽤, 但需要注意的问题

• INFO: 普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息, 例如系统启动完成、请求处理完成等.

• DEBUG: 调试信息, 需要调试时候的关键信息打印.

• TRACE: 追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)

⽇志级别的使⽤

⽇志级别是开发⼈员⾃⼰设置的. 开发⼈员根据⾃⼰的理解来判断该信息的重要程度,类似公司管理, 通常由领导来判断什么样的事情需要汇报, 什么样的事情不需要汇报.

针对这些级别, Logger 对象分别提供了对应的⽅法, 来输出⽇志

日志对象名

通常使用源代码的类名 , 也可以自定义.

【Spring日志】_第3张图片

这里写了五种不同级别的日志信息

【Spring日志】_第4张图片

然而发现只打印了三条日志信息,debug和trace类型的并未打印.

这是由于日志的输出级别默认是info级别,所以只会打印⼤于等于此级别的⽇志, 也就 是info, warn和error.

配置成debug模式后

debug日志可以打印; 但是trace优先级比debug低,不能打印.

【Spring日志】_第5张图片

日志配置

这里以配置properties文件为例.

1设置日志的级别

logging.level.root: debug

配置根目录下所有文件日志的级别

logging.level.包路径 :debug

配置某个包下文件日志的级别

2设置颜色(idea)

 第一步:打开Edit Configuration

【Spring日志】_第6张图片

第二步:添加这串

  • -Dspring.output.ansi.enabled=ALWAYS

【Spring日志】_第7张图片

3日志持久化

数据保存在数据库中,是一种持久化的方式

日志保存在文件中,也是一种持久化的方式

这里是日志保存在文件中,有两种⽅式

1. 配置⽇志⽂件名

2. 配置⽇志的存储⽬录

logging.file.name

可以是相对路径,也可以是绝对路径. 可以是路径+文件名/ 单独一个文件名(以当前目录作为基准目录)

logging.file.path

只能是目录 比如var/log

注意: logging.file.name 和 logging.file.path 两个都配置的情况下, 只⽣效其⼀, 以 logging.file.name 为准.

比如将日志文件保存到aaa.log

【Spring日志】_第8张图片

4日志分割

【Spring日志】_第9张图片

修改日志格式

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,直接使用就可以 .

【Spring日志】_第10张图片

你可能感兴趣的:(JavaEE进阶,SpringBoot,spring,java,后端)