1. 日志概述
1.1 学习日志的原因
⽇志对我们来说并不陌生,
从JavaSE部分,
我们就在使用 System.out.print 来打印日志了.
通过打印日志来发现和定位问题, 或者根据日志来分析程序的运行过程.
在Spring的学习中, 也经常根据控制台的日志来分析和定位问题.
随着项⽬的复杂度提升, 我们对日志的打印也有了更高的需求, 而不仅仅是定位排查问题.
比如需要记录⼀些用户的操作记录(⼀些审计公司会要求), 也可能需要使用日志来记录用户的⼀些喜好,把日志持久化, 后续进行数据分析等.
但是 System.out.print 不能很好的满⾜我们的需求, 我们就需要使用⼀些专门日志框架(专业的事情交给专业的人去做)
1.2 日志的用途
通过前面的学习, 我们知道日志主要是为了发现问题, 分析问题, 定位问题的, 但除此之外, 日志还有很多用途
1. 系统监控
监控现在⼏乎是⼀个成熟系统的标配, 我们可以通过⽇志记录这个系统的运⾏状态, 每⼀个⽅法的响应时间, 响应状态等, 对数据进⾏分析, 设置不同的规则, 超过阈值时进⾏报警. ⽐如统计⽇志中关键字的数量,并在关键字数量达到⼀定条件时报警,这也是⽇志的常⻅需求之⼀、
2. 数据采集
数据采集是⼀个⽐较⼤的范围, 采集的数据可以作⽤在很多⽅⾯, ⽐如数据统计, 推荐排序等.
• 数据统计: 统计⻚⾯的浏览量(PV), 访客量(UV), 点击量等, 根据这些数据进⾏数据分析, 优化公司运营策略
• 推荐排序: 目前推荐排序应用在各个领域, 我们经常接触的各⾏各业很多也都涉及推荐排序, ⽐如购物, 广告, 新闻等领域. 数据采集是推荐排序⼯作中必须做的⼀环, 系统通过⽇志记录⽤⼾的浏览历史, 停留时⻓等, 算法⼈员通过分析这些数据, 训练模型, 给⽤⼾做推荐.
3. ⽇志审计
随着互联⽹的发展,众多企业的关键业务越来越多的运⾏于⽹络之上. ⽹络安全越来越受到⼤家的关注, 系统安全也成为了项⽬中的⼀个重要环节, 安全审计也是系统中⾮常重要的部分. 国家的政策法规、⾏业标准等都明确对⽇志审计提出了要求. 通过系统⽇志分析,可以判断⼀些⾮法攻击, ⾮法调⽤,以及系统处理过程中的安全隐患.
2. ⽇志使⽤
Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所⽰:
SpringBoot 内置了⽇志框架 Slf4j , 我们可以直接在程序中调⽤ Slf4j 来输出⽇志
2.1 打印⽇志
打印⽇志的步骤:
• 在程序中得到日志对象.
• 使⽤日志对象输出要打印的内容
2.1.1 在程序中得到⽇志对象
在程序中获取⽇志对象需要使用日志工厂 LoggerFactory,如下代码所⽰:
private static Logger longer= LoggerFactory.getILoggerFactory(LoggerController.class);
LoggerFactory.getLogger 需要传递⼀个参数, 标识这个⽇志的名称. 这样可以更清晰的知道是哪个类输出的⽇志. 当有问题时, 可以更⽅便直观的定位到问题类
注意:Logger对象是属于org.slf4j包下的,不要导错包。
2.1.2 使⽤⽇志对象打印⽇志
⽇志对象的打印⽅法有很多种,我们可以先使⽤ info() ⽅法来输出⽇志,如下代码所⽰:
package com.example.demo;
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("------要输出的日志内容------");System.out.println("打印⽇志");return "打印⽇志";}
}
浏览器输入:127.0.0.1:8080/logger查看效果
2.2 ⽇志框架介绍(了解)
SLF4J不同于其他⽇志框架, 它不是⼀个真正的⽇志实现, ⽽是⼀个抽象层, 对⽇志框架制定的⼀种规范,标准, 接⼝. 所有SLF4J并不能独⽴使⽤, 需要和具体的⽇志框架配合使⽤。
2.2.1 ⻔⾯模式(外观模式)
SLF4J是⻔⾯模式的典型应⽤(但不仅仅使⽤了⻔⾯模式).
⻔⾯模式定义
⻔⾯模式(Facade Pattern)⼜称为外观模式, 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接⼝.
其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤。
2.2.1.2 ⻔⾯模式的优点
2.2.2 SLF4J 框架介绍
2.2.2.1 不引⼊⽇志⻔⾯
存在问题:
1. 不同⽇志框架的API接⼝和配置⽂件不同, 如果多个⽇志框架共存, 那么不得不维护多套配置⽂件(这个配置⽂件是指⽤⼾⾃定义的配置⽂件).
2. 如果要更换⽇志框架, 应⽤程序将不得不修改代码, 并且修改过程中可能会存在⼀些代码冲突.
3. 如果引⼊的第三⽅框架, 使⽤了多套, 那就不得不维护多套配置
2.2.2.2 引⼊⽇志⻔⾯
引⼊⻔⾯⽇志框架之后, 应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架实现), 此时应⽤程序只需要维护⼀套⽇志⽂件配置, 且当底层实现框架改变时, 也不需要更改应⽤程序代码
2.3 ⽇志格式的说明
从上图可以看到,⽇志输出内容元素具体如下:1. 时间⽇期:精确到毫秒2. ⽇志级别:ERROR, WARN, INFO, DEBUG 或TRACE3. 进程ID4. 线程名5. Logger名(通常使⽤源代码的类名)6. ⽇志内容
2.4 ⽇志级别
-有了⽇志级别之后就可以过滤⾃⼰想看到的信息了,
⽐如只关注error级别的, 就可以根据级别过滤出来error级别的⽇志信息, 节约开发者的信息筛选时间
2.4.1 ⽇志级别的分类
⽇志级别通常和测试⼈员的Bug级别没有关系.⽇志级别是开发⼈员设置的, ⽤来给开发⼈员看的. ⽇志级别的正确设置, 也与开发⼈员的⼯作经验有关.如果开发⼈员把error级别的⽇志设置成了info, 就很有可能会影响开发⼈员对项⽬运⾏情况的判断. 出现error级别的⽇志信息较多时, 可能也没有任何问题. 测试的bug级别更多是依据现象和影响范围来判断
⽇志级别的顺序:
2.4.2 ⽇志级别的使⽤
/*** 打印不同级别的⽇志* @return*/
@RequestMapping("/printLog")
public String printLog() {logger.trace("================= trace ===============");logger.debug("================= debug ===============");logger.info("================= info ===============");logger.warn("================= warn ===============");logger.error("================= error ===============");return "打印不同级别的⽇志" ;
}
SpringBoot 默认的⽇志框架是Logback, Logback没有 FATAL 级别, 它被映射到 ERROR .出现fatal⽇志,表⽰服务已经出现了某种程度的不可⽤, 需要需要系统管理员紧急介⼊处理. 通常情况下, ⼀个进程⽣命周期中应该最多只有⼀次FATAL记录.
2.5 ⽇志配置
2.5.1 配置⽇志级别
logging.level.root: debug
2.5.2 ⽇志持久化
⽇志持久化有两种⽅式1. 配置⽇志⽂件名logging.file.name : logger/springboot.log后⾯可以跟绝对路径或者相对路径2. 配置⽇志的存储⽬录logging.file.path : D:/temp这种⽅式只能设置⽇志的路径, ⽂件名为固定的spring.log注意:logging.file.name 和 logging.file.path 两个都配置的情况下,只⽣效其⼀,以 logging.file.name 为准
2.5.3 配置⽇志⽂件分割
配置项 | 说明 | 默认值 |
logging.logback.rollingpolicy.fil e-name-pattern | ⽇志分割后的⽂件名 格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
logging.logback.rollingpolicy.m ax-file-size | ⽇志⽂件超过这个⼤ ⼩就⾃动分割 | 10MB |
配置日志文件分割
logging.logback.rollingpolicy.file-name-pattern = ${LOG_FILE}.%d{yyyy-MM-dd}.%ilogging.logback.rollingpolicy.max-file-size = 1KB
1. ⽇志⽂件超过1KB就分割(设置1KB是为了更好展⽰. 企业开发通常设置为200M, 500M等, 此处没有明确标准)2. 分割后的⽇志⽂件名为: ⽇志名.⽇期.索引
项⽬运⾏, 多打印⼀些⽇志, ⽇志分割结果:
2.5.4 配置⽇志格式
打印⽇志的格式, 也是⽀持配置的. ⽀持控制台和⽇志⽂件分别设置(不重要)