什么是SpringBoot 日志?
SpringBoot是用来发现和定位问题的,跟着日志分析运行过程
SpringBoot 日志的其他通途
系统监控
数据采集
日志审计
我们启动项目观察日志
其中从左到右分别是时间、级别、进程ID、线程、打印日志的类、日志内容
日志的使用
那么上面的是SpirngBoot启动时的默认日志它跟System.out.print有什么区别呢?
可以看到它比System.out.println多了许多信息
这是因为 SpringBoot 内置了⽇志框架Slf4j
我们可以直接使用这个来输出日志
例如:在程序中得到日志对象
在程序中获取对象要是有日志工厂LoggerFactory
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
注意:Logger对象是属于org.slf4j包下的
然后日志有六个日志级别
FALTAL | 致命信息,表示需要立即处理的系统级错误 |
ERROR | 错误信息,级别较⾼的错误⽇志信息,但仍然不影响系统的继续运⾏ |
WARN | 警告信息,不影响使⽤,但需要注意的问题 |
INFO | 普通信息,⽤于记录应⽤程序正常运⾏时的⼀些信息,例如系统启动完成、请求处理完成等 |
DEBUG | 调试信息,需要调试时候的关键信息打印 |
TRACE | 追踪信息,比DEBUG更细粒度的信息事件 |
@RestController
public class LoggerController {
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/logger")
public String logger(){
System.out.println("打印日志");
logger.error("error日志");
logger.warn("warnr日志");
logger.info("info日志");
logger.debug("debug日志");
logger.trace("trace日志");
return "打印日志";
}
}
结果:
这里的FALTAL如果出现了就证明程序有致命错误 SpringBoot 默认的⽇志框架是Logback,Logback没有 FATAL 级别,它被映射到ERROR .出现fatal⽇志,表⽰服务已经出现了某种程度的不可⽤,需要需要系统管理员紧急介⼊处理.通常情况下,⼀个进程⽣命周期中应该最多只有⼀次FATAL记录.
结果发现,只打印了info,warn和error级别的⽇志这与⽇志级别的配置有关, ⽇志的输出级别默认是info级别,所以只会打印⼤于等于此级别的⽇志,也就是info, warn和error
认识门面模式(外观模式)
SLF4J包是门面模式的典型应用
门面模式定义
门面模式又被称为外观模式,提供了⼀个统⼀的接⼝,⽤来访问⼦系统中的⼀群接口
例如
门面模式有主要包含2种角色
外观角色(Facade):也称门面角色,系统对外的统⼀接口
子系统角色:可以同时有一个或多个SubSystem都是一个类的集合SubSystem并不知道Facade的存在,对于 SubSystem⽽⾔,Facade只是另⼀个客户端
门面模式的实现
例如:
设计一个总开关来控制屋内各个灯
public class FacadePatternDemo {
public static void main(String[] args) {
LightFacade lightFacade = new LightFacade();
lightFacade.lightOn();
}
}
//灯的门面
public class LightFacade {
private Light livingRoomLight = new LivingLight();
private Light hallLight = new HallLight();
private Light diningLight = new DiningLight();
public void lightOn(){
livingRoomLight.on();
hallLight.on();
diningLight.on();
}
public void lightOff(){
livingRoomLight.off();
hallLight.off();
diningLight.off();
}
}
interface Light {
void on();
void off();
}
package com.Lightface;
public class DiningLight implements Light{
@Override
public void on() {
System.out.println("打开餐厅灯");
}
@Override
public void off() {
System.out.println("关闭餐厅灯");
}
}
//客厅灯
public class LivingLight implements Light{
@Override
public void on(){
System.out.println("打开客厅灯");
}
@Override
public void off(){
System.out.println("关闭客厅灯");
}
}
public class DiningLight implements Light{
@Override
public void on() {
System.out.println("打开餐厅灯");
}
@Override
public void off() {
System.out.println("关闭餐厅灯");
}
}
结果:
⻔⾯模式的优点
减少了系统的相互依赖.实现了客⼾端与⼦系统的耦合关系,这使得⼦系统的变化不会影响到调⽤它的客⼾端;
提⾼了灵活性,简化了客⼾端对⼦系统的使⽤难度,客⼾端⽆需关⼼⼦系统的具体实现⽅式,⽽只需要和⻔⾯对象交互即可
提⾼了安全性.可以灵活设定访问权限,不在⻔⾯对象中开通⽅法,就⽆法访问
SLF4J 框架介绍
SLF4J就是其他日志框架的门面可以理解为为日志服务的统一API接口并不涉及具体的日志逻辑实现
slf4j 并不是一个真实的日志实现.而是日志门面具体实现是log4j/2 logback等…
日志门面
日志配置
日志级别顺序
FATAL>ERROR>WARN>INFO>DEBUG>TRACE
配置⽇志级别
之前的日志级别默认是info通常情况不打印比它低级的级别我们可以通过配置之后打印出比它低级的日志
⽇志级别配置只需要在配置⽂件中设置"logging.level"配置项即可
例如:
yml配置
logging:
level:
root: debug
运行之后会看到
日志持久化
前面的日志都是输出在控制台上的我们需要把⽇志保存下来,以便出现问题之后追溯问题.把⽇志保存下来就叫持久化
配置日志文件名
配置日志的存储目录
logging.file.name
logging.file.path
例如:
yml配置
logging:
file:
name: logger/springboot.log
配置⽇志⽂件的保存路径
logging:
file:
path: D:/templog
运行后会多一个文件
生成的文件名固定为spring.log