博主主页:码农派大星.
数据结构专栏:Java数据结构
数据库专栏:MySQL数据库
JavaEE专栏:JavaEE
软件测试专栏:软件测试
关注博主带你了解更多知识
目录
1. 志概述
志对我们来说并不陌,从JavaSE部分,我们就在使 System.out.print 来打印志了.通过打 印志来发现和定位问题,或者根据志来分析程序的运过程.在Spring的学习中,也经常根据控制台 的志来分析和定位问题.随着项的复杂度提升,我们对志的打印也有了更的需求,不仅仅是定位排查问题. 如需要记录些的操作记录,也可能需要使志来记录的些喜好, 把志持久化,后续进数据分析等.但是 System.out.print 不能很好的满我们的需求,我们就需要使些专志框架
1.1 志的途
1. 系统监控
监控现在乎是个成熟系统的标配, 我们可以通过志记录这个系统的运状态,每个法的响应 时间,响应状态等,对数据进分析,设置不同的规则,超过阈值时进报警.如统计志中关键字的数 量,并在关键字数量达到定条件时报警,这也是志的常需求之
2. 数据采集
推荐排序: 前推荐排序应在各个领域,我们经常接触的各各业很多也都涉及推荐排序,如购 物,告,新闻等领域.数据采集是推荐排序作中必须做的环,系统通过志记录的浏览历 史,停留时等,算法员通过分析这些数据,训练模型,给做推荐
数据统计:统计的浏览量(PV),访客量(UV),点击量等,根据这些数据进数据分析,优化公司运营 策略
3. 志审计
随着互联的发展,众多企业的关键业务越来越多的运于络之上.络安全越来越受到家的关 注,系统安全也成为了项中的个重要环节, 安全审计也是系统中常重要的部分.国家的政策法规、 业标准等都明确对志审计提出了要求.通过系统志分析,可以判断些法攻击,法调,以 及系统处理过程中的安全隐患
2. 志使
SpringBoot 内置了志框架 Slf4j ,我们可以直接在程序中调 Slf4j 来输出志
Slf4j 打印的志和 System.out.print 有什么不同:
我们通过 System.out.print 打印的志,SpringBoot 内置了志框架打印的志缺少了很多信息
2.1 打印志
2.1.1 在程序中得到志对象
在程序中获取志对象需要使志LoggerFactory
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
LoggerFactory.getLogger 需要传递个参数,标识这个志的名称.这样可以更清晰的知道是哪个类 输出的志.当有问题时,可以更便直观的定位到问题类
Logger对象是属于org.slf4j包下的,不要导错包
2.1.2 使志对象打印志
@RequestMapping("/log")
@RestController
public class LoggerController {
private static Logger logger =LoggerFactory.getLogger(LoggerController.class);
@PostConstruct
public void print(){
System.out.println("================");
System.out.println("打印日志");
logger.info("打印日志");
}
}
2.2 模式(外观模式)
SLF4J是门面模式的典型应用(但不仅仅使用门面模式)
模式称为外观模式,提供了个统的接,来访问系统中的群接. 其主要特征是定义了个层接,让系统更容易使同时隐藏了系统的复杂性。这种模式通常用于简化客户端与复杂系统的交互,隐藏系统的内部结构
门面模式实现:
比如说我回家,我们会开各个屋的灯.离开家时,会关闭各个屋的灯 如果家设置个总开关,来控制整个屋的灯就会很便
public class FacadePatternDemo {
public static void main(String[] args) {
//调用门面
LightFacade lightFacade = new LightFacade();
lightFacade.lightOn();
}
}
//灯的门面
class LightFacade{
private Light livingRoomLight = new LivingRoomLight();
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();
}
}
//客厅灯
class LivingRoomLight implements Light{
@Override
public void on() {
System.out.println("打开客厅灯");
}
@Override
public void off() {
System.out.println("关闭客厅灯");
}
}
//走廊灯
class HallLight implements Light{
@Override
public void on() {
System.out.println("打开?廊灯");
}
@Override
public void off() {
System.out.println("关闭?廊灯");
}
//餐厅灯
class DiningLight implements Light{
@Override
public void on() {
System.out.println("打开餐厅灯");
}
@Override
public void off() {
System.out.println("关闭餐厅灯");
}
}
模式的优点:
减少了系统的相互依赖.实现了客端与系统的耦合关系,这使得系统的变化不会影响到调它 的客端,
门面模式将客户端与子系统解耦,客户端只需要与门面接口交互,而不是直接与子系统中的多个组件交互。
提了灵活性,简化了客端对系统的使难度,客端需关系统的具体实现式,只需 要和对象交互即可
提了安全性.可以灵活设定访问权限,不在对象中开通法,就法访问
门面模式和模板模式:
门面模式提供了一个统一的接口来访问一个子系统中的一组操作,代码层面就是接口
模板模式定义了一个模板方法,代码层面上就是抽象类,定义一些基本的方法,供子类实现或重写
父类中定义的模板方法提供了一个通用的框架,可以在多个子类中复用
门面模式的目的是简化客户端与复杂子系统的交互,而模板模式的目的是定义一些模版框架,让子类实现具体的操作
门面模式通常通过创建一个高层次的接口来实现,而模板模式则通过在抽象类中定义一个模板方法来实现
门面模式隐藏了子系统的复杂性,客户端不需要知道子系统的具体实现;模板模式则提供了操作的模版框架,子类只需要遵循这个框架来实现具体的步骤
灵活性比较:
模板模式 提供了在固定算法结构内的灵活性,允许子类定制算法的某些步骤,但不允许改变算法的整体结构。这种灵活性适用于需要保持算法结构一致性的场景。
门面模式 提供了在客户端和复杂子系统之间的灵活性,允许客户端通过一个简单的接口与系统交互,而不需要了解子系统的内部复杂性。这种灵活性适用于需要简化客户端与复杂系统交互的场景。
2.3 SLF4J 框架
SLF4J 就是其他志框架的.SLF4J可以理解为是提供志服务的统API接,并不涉及到具体的志逻辑实现
不引志
常的志框架有log4J,logback等.如果个项已经使了log4j,你依赖的另个类库,假如是 ApacheActive MQ,它依赖于另外个志框架logback,那么你就需要把logback也加载进去
存在问题:
1. 不同志框架的API接和配置件不同,如果多个志框架共存,那么不得不维护多套配置件(这 个配置件是指定义的配置件).
2. 如果要更换志框架,应程序将不得不修改代码,并且修改过程中可能会存在些代码冲突.
3. 如果引的第三框架,使了多套,那就不得不维护多套配置引志
引志
引志框架之后,应程序和志框架(框架的具体实现)之间有了统的API接(志框架 实现),此时应程序只需要维护套志件配置,且当底层实现框架改变时,也不需要更改应程序代码.
SLF4J 就是这个志
SLF4J使你的代码独于任意个特定的志API,这是个对于开发API的开发者很好的思想
2.4志级别
2.4.1 日志级别分类
志的级别从到低依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE
FATAL:致命信息,表需要即被处理的系统级错误.
ERROR:错误信息,级别较的错误志信息,但仍然不影响系统的继续运.
WARN:警告信息,不影响使,但需要注意的问题
INFO:普通信息,于记录应程序正常运时的些信息,例如系统启动完成、请求处理完成等.
DEBUG:调试信息,需要调试时候的关键信息打印.
TRACE:追踪信息,DEBUG更细粒度的信息事件(除有特殊意,否则请使DEBUG级别替代)
2.4.2 志级别的使
@RequestMapping("/log")
@RestController
public class LoggerController {
private static Logger logger =LoggerFactory.getLogger(LoggerController.class);
@PostConstruct
public void print(){
System.out.println("================");
System.out.println("打印日志");
logger.info("打印日志");
logger.trace("================= trace ===============");
logger.debug("================= debug ===============");
logger.info("================= info ===============");
logger.warn("================= warn ===============");
logger.error("================= error ===============");
}
}
结果发现,只打印了info,warn和error级别的志
这与志级别的配置有关, 志的输出级别默认是info级别,所以只会打印于等于此级别的志,也就 是info, warn和error
2.5 日志配置
2.5.1 配置志级别
志级别配置只需要在配置件中设置"logging.level"配置项
yml配置:
logging:
level:
com:
VerificationCode:
demo: trace
2.5.2 志持久化
把志保存下来就叫持久化
yml配置:
level:
file:
path: E:/temp
给配置文件命名:
logging:
file:
name: lxy
logging:
file:
name: logger/lxy.log
2.5.3 配置志件分割
默认志件超过10M就进分割
logging.logback.rollingpolicy.max-file-size
logging.logback.rollingpolicy.file-name-pattern
3. 添加lombok依赖
每次都使LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加遍,lombok给我们提供了 种更简单的式
1.添加lombok框架持
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.使 @slf4j 注解输出志
成功输出志: