当前位置: 首页 > news >正文

Spring日志

1.日志的作用

  1. 定位和发现问题(主要)
  2. 系统监控
  3. 数据采集
  4. 日志审计......

2.日志的使用

2.1 ⽇志格式的说明

2.2 打印日志

Spring集成了日志框架,直接使用即可

步骤:

1.定义日志对象

2.使⽤⽇志对象打印⽇志

@RestController
public class LoggerController {private static Logger logger = LoggerFactory.getLogger(LoggerController.class);//(类名/类名.class)//从日志工厂拿到对象@PostConstructpublic void print(){System.out.println("打印日志");}
}

 这里要注意几点:

  •                        (Logger是 org.slf4j 包下的)

2.3 ⽇志框架介绍

SLF4J不同于其他⽇志框架, 它不是⼀个真正的⽇志实现,而是一个抽象层.

是对⽇志框架制定的⼀种规范, 标准,接⼝.

所有SLF4J并不能独⽴使⽤,需要和具体的⽇志框架配合使⽤

2.2.1 ⻔⾯模式(外观模式)

2.2.1.1 解释

SLF4J是⻔⾯模式的典型应⽤

⻔⾯模式(外观模式), 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接⼝. 其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤.

这里并不关心子系统的实现,只关心SLF4J(解耦)

⽐如去医院看病,可能要去挂号, ⻔诊, 化验, 取药, 让患者或患者家属觉得很复杂, 如果有提供接待⼈员, 只让接待⼈员来处理, 就很⽅便. 

2.2.1.2 实现

场景实现:

当我们回家后, 我们会开各个屋的灯. 离开家时, 我们会关闭各个屋的灯,这就会很麻烦.

而如果家⾥设置⼀个总开关, 来控制整个屋的灯就会很⽅便.

public interface Light {void on();void off();
}public class DiningLight 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 LivingLight implements Light{@Overridepublic void on() {System.out.println("打开客厅灯");}@Overridepublic void off() {System.out.println("关闭客厅灯");}
}//对这些进行封装
//门面
public class FacadePattern {public void lightOn(){HallLight hallLight = new HallLight();hallLight.on();LivingLight livingLight = new LivingLight();livingLight.on();DiningLight diningLight = new DiningLight();diningLight.on();}
}public class Main {public static void main(String[] args) {FacadePattern facadePattern = new FacadePattern();facadePattern.lightOn();}
}

2.2.1.3 优点 
  • 减少了系统的相互依赖.
  • 实现了客⼾端与⼦系统的耦合关系, 这使得⼦系统的变化不会影响到调⽤它的客⼾端.

2.2.2 SLF4J 框架介绍

SLF4J 就是其他⽇志框架的⻔⾯

SLF4J可以理解为是提供⽇志服务的统⼀API接⼝,并不涉及到具体的⽇志逻辑实现

①不引入日志门面:

常⻅的⽇志框架有log4J,logback等.如果⼀个项⽬已经使⽤了log4j,⽽你依赖的另⼀个类库,假如是ApacheActive MQ,它依赖于另外⼀个⽇志框架logback,那么你就需要把logback也加载进去.

存在问题:

1. 不同⽇志框架的API接⼝和配置⽂件不同, 如果多个⽇志框架共存, 那么不得不维护多套配置⽂件(这个配置⽂件是指⽤⼾⾃定义的配置⽂件).

2. 如果要更换⽇志框架, 应⽤程序将不得不修改代码, 并且修改过程中可能会存在⼀些代码冲突.

3. 如果引⼊的第三⽅框架, 使⽤了多套, 那就不得不维护多套配置.

SLF4J使代码独⽴于任意⼀个特定的⽇志API,这是⼀个对于开发API的开发者很好的思想.

 

②引入日志门面

引⼊⻔⾯⽇志框架之后,应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架实现),此时应⽤程序只需要维护⼀套⽇志⽂件配置,且当底层实现框架改变时,也不需要更改应⽤程序代码.

SLF4J 就是这个⽇志⻔⾯

 

2.4 ⽇志级别

2.4.1 ⽇志级别的分类

级别(从高到低)解释(级别越⾼, 收到的消息越少)
FATAL致命信息,表⽰需要⽴即被处理的系统级错误
ERROR错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏
WARN警告信息, 不影响使⽤, 但需要注意的问题
INFO普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息, 例如系统启动完成、请求处理完成等
DEBUG调试信息, 需要调试时候的关键信息打印
TRACE追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)

  

2.4.2 ⽇志级别的使⽤

@RestController
public class LoggerController {private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@PostConstructpublic void print(){System.out.println("打印日志");logger.info("============我是日志框架打印的日志==============");logger.error("我是error日志");logger.warn("我是warn日志");logger.info("我是info日志");logger.debug("我是debug日志");logger.trace("我是trace日志");}
}

 可以看出,这里打印了error,warn,info,而没有打印debug和trace,

这是因为Spring默认的日志级别是info,所以只会打印⼤于等于此级别的⽇志,即info,warn,error.

2.5 ⽇志配置

2.5.1 配置⽇志级别

logging:level:root: debug

 此时就可以打印debug级别的日志了:

debug会打印较多日志,影响观察,可以对日志进行分目录打印

比如Spring的日志只打印info,项目日志打印debug级别(root表示根目录)

 

此时日志就少了:

 


日志也可以设置颜色(只能设置控制台的颜色):

2.5.2 ⽇志持久化

日志持久化就是把日志保存在文件中

2.5.2.1 配置⽇志⽂件的路径和⽂件名

 

2.5.2.2 配置⽇志⽂件的保存路径

 

 这种⽅式只能设置⽇志的路径, ⽂件名为固定的spring.log

2.5.2.3 比较总结

  • name既可以设置路径,又可以设置名称
  • path只能设置路径,默认名称是spring.log
  • 如果没有加路径,默认放在当前项目下
  • 如果两者同时存在,path就失效了,name的优先级要高于path

2.5.3 配置⽇志⽂件分割

  • 当然不是说,只要达到1KB就立即进行分割的,是以行来进行的,不是以字符.
  • 分割后的⽇志⽂件名为:⽇志名.⽇期.索引

2.5.4 配置⽇志格式(了解)

3. 更简单的⽇志输出

因为每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐, 并且需要每个类都添加⼀遍, 而lombok给我们提供了 ⼀种更简单的⽅式:

使⽤ @slf4j 注解输出⽇志

@Slf4j
@RestController
public class LoggerController {//private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@PostConstructpublic void print(){System.out.println("打印日志");log.info("============我是日志框架打印的日志==============");log.error("我是error日志");log.warn("我是warn日志");log.info("我是info日志");log.debug("我是debug日志");log.trace("我是trace日志");}
}

http://www.lryc.cn/news/425200.html

相关文章:

  • 年薪30万+,TOP大厂月薪10万+....网络安全工程师凭什么?
  • WebView 的常见的安全漏洞:
  • 【python】Python中subprocess模块的参数解读以及应用实战
  • opencv-python实战项目十一:背景减除法制作运动行人蒙版
  • 安防监控/视频汇聚平台EasyCVR如何配置,实现默认获取设备的子码流?
  • JavaScript基础——闭包
  • Linux基础入门---安装vmware
  • 用AppleScript点击无效,继续用pyautogui.click()
  • 谈谈我用MemFire Cloud开发应用的这一两年
  • AI安全-文生图
  • Hibernate 使用详解
  • 乐普医疗校招社招笔试/测评通关攻略、最新北森题库、可搜索答案
  • uniapp在线下载安装包更新app
  • Unity | AmplifyShaderEditor插件基础(第一集:简单了解ASE和初识)
  • Windows文件资源管理器未响应,磁盘状态正常,很可能是这个原因
  • 良好的代码习惯
  • 音乐生成模型应用
  • DBEUG:二维图尺寸没思路
  • 【图像去雾系列】使用SSR/MSR/MSRCR/MSRCP/automatedMSRCR算法对单图像进行图像增强,达到去雾效果
  • oracle普通导出导入
  • 如何将CSDN文章导出为pdf文件
  • 利用Python实现供应链管理中的线性规划与资源优化——手机生产计划1
  • Spring Cloud全解析:配置中心之springCloudConfig分布式配置动态刷新
  • mac如何查看shell是 zsh还是bash
  • STM32cubeMX配置Systick的bug
  • 分享几个好用js片段
  • web前端之实现一只可爱的小杰尼乌龟、伪元素、动画
  • 银河麒麟服务器版在rc.local使用ifcong 配置IP和nmcli的区别
  • 【运维】深入理解 Linux 中的 `mv` 命令,使用 `mv` 移动所有文件但排除特定文件或文件夹
  • Xilinx课程,就这么水灵灵地上线了~