日志的使用
先引入日志对象,注意是 引入的是 org.slf4j 这个包下的 Logger
在传参上:可以传入类名,或者一个字符串,该参数表示日志名称
例如如果传入 “aaaa”,那么日志的名称就是 aaaa
@RequestMapping("/log")
@RestController
public class LogController {private final static Logger logger = LoggerFactory.getLogger("aaaa");@RequestMapping("/print")public void print() {logger.debug("logger debug");logger.info("logger info");logger.error("logger error");logger.trace("logger trace");logger.warn("logger warn");}
}
如果传入类名,日志的名称为全限定名(包名 + 类名)
package org.example.springcaptcha.log.controller;@RequestMapping("/log")
@RestController
public class LogController {private final static Logger logger = LoggerFactory.getLogger(LogController.class);@RequestMapping("/print")public void print() {logger.debug("logger debug");logger.info("logger info");logger.error("logger error");logger.trace("logger trace");logger.warn("logger warn");}
}
日志的等级
在运行上述代码后并访问之后,我们获得如下的访问内容:
你会发现这个日志只打印了三条,因为日志默认打印的起始等级为 info
日志的级别从高到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE
• FATAL: 致命信息,表示需要立即被处理的系统级错误.
• ERROR: 错误信息, 级别较高的错误日志信息, 但仍然不影响系统的继续运行.
• WARN: 警告信息, 不影响使用, 但需要注意的问题
• INFO: 普通信息,用于记录应用程序正常运行时的⼀些信息, 例如系统启动完成、请求处理完成等.
• DEBUG: 调试信息, 需要调试时候的关键信息打印.
• TRACE: 追踪信息, 比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使用DEBUG级别替代)
FATAL 在这里没有方法提供给我们使用
默认的的打印等级最低为 info
如何设置默认的打印等级:
使用配置文件来进行修改:
示例: yml 格式
logging:level:root: debug
properties 格式:
logging.level.root=debug
SLF4J 框架介绍
SLF4J 是其他日志框架的门面,SLF4J 可以理解为是提供日志服务的统一 API 接口,并不涉及到具体日志逻辑实现
不引入日志门面的话存在哪些问题:
1.不同的日志框架提供的 API 接口和配置文件不同,如果多个日志框架并存,那么不得不维护多套配置文件(该配置文件指用户自定义的配置文件)
2. 如果要更换日志框架,应用程序不得不修改代码,并且修改过程中可能会存在一些代码冲突
3. 如果引入的第三方框架,使用了多套,那就不得不维护多套配置
引入日志门面之后
应用程序和日志框架之间有了统一的API 接口,此时应用程序只需要维护一套日志文件的配置,且当底层实现框架改变的时候,也不需要更改应用程序的代码
门面模式(外观模式)
门面模式又被称为外观模式,提供了统一的接口,用来访问子系统
其主要的特征为定义了一个高层接口,让子系统更容易使用
门面模式的优点:
减少了系统的相互依赖,实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到它调用的客户端
提高了灵活性,简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要与门面对象交互即可
提高了安全性,可以灵活设定访问权限,不在门面对象中开通方法,就无法访问
示例:通过门面统一控制灯的开与关
子系统实现:
public interface Light {void on();void off();
}public class BedRoomLight implements Light {@Overridepublic void on() {System.out.println("卧室灯亮");}@Overridepublic void off() {System.out.println("卧室灯灭");}
}public class HallLight implements Light {@Overridepublic void on() {System.out.println("走廊灯亮");}@Overridepublic void off() {System.out.println("走廊灯灭");}
}public class LivingRoomLight implements Light {@Overridepublic void on() {System.out.println("客厅灯亮");}@Overridepublic void off() {System.out.println("客厅灯灭");}
}
门面实现:
public class FacadeCilent {BedRoomLight bedRoomLight = new BedRoomLight();HallLight hallLight = new HallLight();LivingRoomLight livingRoomLight = new LivingRoomLight();public void on() {bedRoomLight.on();hallLight.on();livingRoomLight.on();}public void off() {bedRoomLight.off();hallLight.off();livingRoomLight.off();}
}
测试类:
public class Test {public static void main(String[] args) {FacadeCilent facadeCilent = new FacadeCilent();facadeCilent.off();facadeCilent.on();}
}
日志格式说明
日志的持久化保存
我们依旧要使用配置文件来定义日志保存的路径或者文件夹,以及日志的分割等信息
配置日志的保存的文件夹:
yml:
logging:file:name: logger/springboot.log
properties:
logging.file.name=logger/springboot.log
创建好 logger 文件夹之后并且将文件 springboot.log 也创建出来了:
配置日志保存的路径:
yml:
logging:file:path: D:/code
properties:
logging.file.path=D:/code
会在指定的路径下生成 spring.log 文件
当logging.file.name 和 logging.file.path 两个配置都存在的情况下,只能生效其中一个,以 logging.file.name 为准
日志的分割:
我们可以通过配置文件来定义多大空间的日志就进行一次分割
logging:logback:rollingpolicy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
max-file-size 设置日志文件的最大值
file-name-pattern 设置日志文件的文件名称格式
日志的简单使用
使用 lombok 下 的 注解:@Slf4j
我们可以直接使用变量 log 来进行日志的打印:
@RequestMapping("/log2")
@RestController
@Slf4j
public class LogController2 {@RequestMapping("/print")public void print() {log.debug("logger debug");log.info("logger info");log.error("logger error");log.trace("logger trace");log.warn("logger warn");}
}
我们可以在 target 文件夹下观察到 @Slf4j 直接消失,多出来一个 Logger 对象,并且对象名为 log
因此我们可以直接使用 log 来进行日志的打印