目录
日志作用
①系统监控 通过⽇志记录这个系统的运⾏状态,每⼀个⽅法的响应 时间,响应状态等,对数据进⾏分析,设置不同的规则,超过阈值时进⾏报警.⽐如统计⽇志中关键字的数 量,并在关键字数量达到⼀定条件时报警,这也是⽇志的常⻅需求之⼀
②数据采集 数据采集是⼀个⽐较⼤的范围,采集的数据可以作⽤在很多⽅⾯,⽐如数据统计,推荐排序等.
③⽇志审计 通过系统⽇志分析,可以判断⼀些⾮法攻击,⾮法调⽤,以 及系统处理过程中的安全隐患.
⽐如,⼤家平时都在做运营系统,其中运营⼈员在通过界⾯处理⼀些数据的时候,如果没有清楚的⽇志 操作记录,⼀条数据被删除或者修改,你是⽆法找到是谁操作的,但是如果你做了相应的记录,该数 据被谁删除或者修改就会⼀⽬了然. 还有⼀些内部的违规和信息泄漏(⽐如客⼾信息被卖掉)现象出现后,如果未记录留存⽇志,为事后调查 提供依据,则事后很难追查(⼀些公司查看客⼾的信息都会被记录⽇志,如果频繁查询也会报警)
SpringBoot中内置了日志框架Slf4j
打印日志步骤
①在程序中得到日志对象
②使⽤⽇志对象输出要打印的内容
在程序中获取⽇志对象需要使⽤⽇志⼯⼚LoggerFactory
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
//参数设为类名,可以更清晰的知道是哪个类输出的⽇志.当有问题时,可以更⽅便直观的定位到问题类
注意是org.slf4j包下的
@RestController
public class LoggerController {
//①在程序中得到日志对象
private static Logger logger= LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/log")
public String logger(){
//②使⽤⽇志对象输出要打印的内容
logger.info("------------日志内容-----------");
return "日志aa";
}
}
日志级别
FATAL:致命信息,表⽰需要⽴即被处理的系统级错误.
ERROR:错误信息,级别较⾼的错误⽇志信息,但仍然不影响系统的继续运⾏.
WARN:警告信息,不影响使⽤,但需要注意的问题
INFO:普通信息,⽤于记录应⽤程序正常运⾏时的⼀些信息,例如系统启动完成、请求处理完成等.
DEBUG:调试信息,需要调试时候的关键信息打印
TRACE:追踪信息,⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)
⽇志的输出级别默认是info级别,所以只会打印⼤于等于此级别的⽇志,但可以在配置文件中配置日志级别
logging:
level:
root: debug
SLF4J是对日志框架指定的一种规范、标准、接口,不是一个真正的日志实现,而是一个抽象层,需要搭配具体的日志框架使用
SLF4J是其他⽇志框架的⻔⾯.SLF4J可以理解为是提供⽇志服务的统⼀API接⼝,并不涉及到具体的 ⽇志逻辑实现.
下面,我们来介绍门面模式
门面模式(外观模式)(Facade Pattern)
⼀个⼦系统的外部与其内部的通信必须通过⼀个统⼀的对象进⾏.⻔⾯模式提供⼀个⾼层 次的接⼝,使得⼦系统更易于使⽤.
类比于看病
⻔⾯模式的优点
- 减少了系统的相互依赖.实现了客⼾端与⼦系统的耦合关系,这使得⼦系统的变化不会影响到调⽤它的客⼾端;
- 提⾼了灵活性,简化了客⼾端对⼦系统的使⽤难度,客⼾端⽆需关⼼⼦系统的具体实现⽅式,⽽只需 要和⻔⾯对象交互即可.
- 提⾼了安全性.可以灵活设定访问权限,不在⻔⾯对象中开通⽅法,就⽆法访问
不使用日志门面时,如果你的项目已经使用了log4j,而依赖的另一个类库,依赖于另一个日志框架logback,就需要同时加载logback,这样会存在一些问题,比如需要维护多套配置、可能会起一些冲突等
使用门面日志框架后,应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架 实现),此时应⽤程序只需要维护⼀套⽇志⽂件配置,且当底层实现框架改变时,也不需要更改应⽤程序代码.
日志持久化
把日志保存下来
配置日志路径+文件名
logging:
file:
name: logger/springboot.log
配置日志路径,文件名固定为spring.log
logging:
file:
path: D:/temp
logging.file.name和logging.file.path都配置的情况下,以logging.file.name为准
配置日志文件分割
对日志文件分割避免某个日志文件过大
日志框架中默认日志文件超过10M就进行分割
logging:
logback:
rollingpolicy:
max-file-size: 1KB #日志文件超过这个大小就自动分割
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i #日志文件名格式
注意:并不是严格按照设定的文件大小分割,需要将一行完整输出后才分割文件
配置日志格式
配置项
|
说明
|
默认值
|
---|---|---|
logging.pattern.console
|
控制台⽇志格式
| "%clr(%d{${LOG_DATEFORMAT_PATTERN:-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-MM-dd'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 显⽰⽇志级别ERROR,MARN,INFO,DEBUG,TRACE.
4. %t 线程名.%c 类的全限定名.%M method.%L 为⾏号.%thread 线程名称.%m 或者 %msg 显⽰输出消息.%n 换⾏符
5. %5 若字符⻓度⼩于5,则右边⽤空格填充.%-5 若字符⻓度⼩于5,则左边⽤空格填充.%.15 若 字符⻓度超过15,截去多余字符.%15.15 若字符⻓度⼩于15,则右边⽤空格填充.若字符⻓度超 过15,截去多余字符
更简单的日志输出
简化LoggerFactory.getLogger(xxx.class)写法
①添加lombok框架支持
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
②使用@Slf4j注解输出日志
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LogController {
public void log(){
log.info("--------------要输出⽇志的内容----------------");
}
}