八、Spring Boot 日志详解
目录
一、日志的用途
二、日志使用
2.1 打印日志
2.1.1 在程序中获取日志对象
2.1.2 使用日志对象打印日志
2.2、日志框架介绍
2.2.1 门面模式(外观模式)
2.2.2 门面模式的实现
2.2.3 SLF4J 框架介绍
2.3 日志格式的说明
2.4 日志级别
2.4.1 日志级别的分类
2.4.2 日志级别的使用
2.5 日志配置
2.5.1 配置日志级别
2.5.2 日志持久化
2.5.3 配置日志文件分割
三、 @Slf4j注解
3.1 添加lombok依赖
3.2 输出日志
一、日志的用途
1. 系统监控
监控现在⼏乎是⼀个成熟系统的标配, 我们可以通过日志记录这个系统的运⾏状态,每⼀个方法的响应 时间,响应状态等,对数据进行分析,设置不同的规则,超过阈值时进⾏报警.⽐如统计⽇志中关键字的数量,并在关键字数量达到⼀定条件时报警,这也是⽇志的常⻅需求之⼀。
2. 数据采集
数据采集是⼀个⽐较大的范围,采集的数据可以作⽤在很多⽅⾯,比如数据统计,推荐排序等.
• 数据统计:统计页面的浏览量(PV),访客量(UV),点击量等,根据这些数据进行数据分析,优化公司运营 策略
• 推荐排序: 目前推荐排序应⽤在各个领域,我们经常接触的各行各业很多也都涉及推荐排序,比如购 物,⼴告,新闻等领域.数据采集是推荐排序⼯作中必须做的⼀环,系统通过日志记录⽤户的浏览历史,停留时长等,算法⼈员通过分析这些数据,训练模型,给⽤户做推荐。
3. 日志审计
随着互联网的发展,众多企业的关键业务越来越多的运行于网络之上.网络安全越来越受到大家的关注,系统安全也成为了项目中的⼀个重要环节, 安全审计也是系统中非常重要的部分.国家的政策法规、行业标准等都明确对日志审计提出了要求.通过系统日志分析,可以判断⼀些非法攻击,非法调⽤,以及系统处理过程中的安全隐患.
二、日志使用
2.1 打印日志
2.1.1 在程序中获取日志对象
在程序中获取日志对象需要使用日志工程LoggerFactory,如下代码所示:
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
注意:Logger对象是属于org.slf4j包下的
2.1.2 使用日志对象打印日志
日志对象的打印方法有很多种,我们可以先使⽤info()方法来输出日志,如下代码所示:
package com.example.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LoggerController {private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@RequestMapping("/logger")public String logger() {logger.info("------要输出的内容-------");return "打印日志";}
}
打印日志效果展示:
2.2、日志框架介绍
SLF4J不同于其他日志框架,它不是⼀个真正的日志实现,而是⼀个抽象层,对日志框架制定的⼀种规范, 标准,接口.所有SLF4J并不能独立使用,需要和具体的日志框架配合使用.
2.2.1 门面模式(外观模式)
门面模式(FacadePattern)又称为外观模式,提供了⼀个统⼀的接⼝,⽤来访问子系统中的⼀群接口. 其主要特征是定义了⼀个⾼层接口,让子系统更容易使用.
门面模式主要包含2种角色:
外观角色(Facade):也称门面角色,系统对外的统一接口,
子系统角色(SubSystem):可以同时有一个或多个SubSystem.每个SubSytem都不是一个单独的类,而是一个类的集合.SubSystem并不知道Facade的存在,对于SubSystem而言,Facade只是另一个客户端而已(即Facade对SubSystem透明)
举个例子:
比如去医院看病,可能要去挂号,门诊,化验,取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
2.2.2 门面模式的实现
场景:
回家时,我们会开各个屋的灯离开家时,会关闭各个屋的灯 如果家里设置⼀个总开关,来控制整个屋的灯的打开与关闭就会很方便。
package FacadePattern;public class FacadePatternDemo {public static void main(String[] args) {LightFacafe lightFacafe = new LightFacafe();lightFacafe.lightOn();lightFacafe.lightOff();}
}interface Light {void on();void off();
}/** 灯的门面* */
class LightFacafe {private Light livingRoomLight = new LivingRoomLight();private Light hallLight = new HallLight();private Light dingingLight = new DingLight();public void lightOn() {livingRoomLight.on();hallLight.on();dingingLight.on();}public void lightOff() {livingRoomLight.off();hallLight.off();dingingLight.off();}
}/** 客厅灯* */class LivingRoomLight implements Light {@Overridepublic void on() {System.out.println("打开客厅的灯");}@Overridepublic void off() {System.out.println("关闭客厅的灯");}
}/** 走廊灯* */class HallLight implements Light {@Overridepublic void on() {System.out.println("打开客厅的灯");}@Overridepublic void off() {System.out.println("关闭客厅的灯");}
}/** 餐厅灯* */class DingLight implements Light {@Overridepublic void on() {System.out.println("打开餐厅的灯");}@Overridepublic void off() {System.out.println("关闭餐厅的灯");}
}
门面模式的优点
1、减少了系统的相互依赖.实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端;
2、提高了灵活性,简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式, 而只需要和门面对象交互即可.
3、提高了安全性.可以灵活设定访问权限,不在门面对象中开通方法,就无法访问
2.2.3 SLF4J 框架介绍
SLF4J 就是其他日志框架的门面.SLF4J可以理解为是提供日志服务的统一API接口,并不涉及到具体的 日志逻辑实现.
引入日志门面
引入门面日志框架之后,应用程序和日志框架(框架的具体实现)之间有了统一的AP接口(门面日志框架实现),此时应用程序只需要维护一套日志文件配置,且当底层实现框架改变时,也不需要更改应用程序代码.
SLF4J 就是这个日志门面. 总的来说,SLF4J使你的代码独立于任意⼀个特定的日志API,这是⼀个对于开发API的开发者很好的思想.
2.3 日志格式的说明
2.4 日志级别
2.4.1 日志级别的分类
日志的级别从高到低依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE
FATAL:致命信息,表示需要立即被处理的系统级错误。
ERROR:错误信息,级别较⾼的错误日志信息,但仍然不影响系统的继续运行。
WARN:警告信息,不影响使用,但需要注意的问题。
INFO:普通信息,用于记录应用程序正常运行时的⼀些信息,例如系统启动完成、请求处理完成等。
DEBUG:调试信息,需要调试时候的关键信息打印。
TRACE:追踪信息,比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使用DEBUG级别替代)
日志级别通常和测试人员的Bug级别没有关系,日志级别是开发人员设置的,用来给开发人员看的.日志级别的正确设置,也与开发人员的工作经验有关.如果开发人员把error级别的日志设置成了info,就很有可能会影响开发人员对项目运行情况的判断.出现error级别的日志信息较多时,可能也没有任何问题,测试的bug级别更多是依据现象和影响范围来判断。
日志级别的顺序:
2.4.2 日志级别的使用
日志级别是开发⼈员自己设置的.开发⼈员根据自己的理解来判断该信息的重要程度
针对这些级别,Logger对象分别提供了对应的方法,来输出日志.
@RestController
public class LoggerController {private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@RequestMapping("/printLog")public String pringtLog() {logger.trace("======trace======");logger.debug("======debug======");logger.info("======info======");logger.warn("======warn======");logger.error("======error======");return "打印不同级别的日志";}
}
SpringBoot默认的日志框架是Logback,Logback没有FATAL级别,它被映射到ERROR
出现fatal日志,表示服务已经出现了某种程度的不可用,需要需要系统管理员紧急介入处理.通常情况下,一个进程生命周期中应该最多只有一次FATAL记录.
观察打印的日志结果:
结果发现,只打印了info,warn和error级别的日志这与日志级别的配置有关,日志的输出级别默认是info级别,所以只会打印大于等于此级别的日志,也就是info,warn和error.
2.5 日志配置
2.5.1 配置日志级别
⽇志级别配置只需要在配置⽂件中设置"logging.level"配置项即可,如下所示例。
Properties配置
logging.level.root=debug
yml配置
logging:level:root=debug:
运行结果:
2.5.2 日志持久化
配置文件名的路径和文件名
Properties配置
logging.file.name=logger/springboot.log
yml配置
logging:level:root=debug:file:name: logger/springboot.log
运行结果显示,日志内容保存在对应的目录下
配置日志文件的保存路径
Properties配置
logging.file.path=D:/temp
yml配置
logging:file:path: C:\logger
运⾏程序,该路径下多出⼀个日志文件:spring.log
注意:
logging.file.name 和 logging.file.path 两个都配置的情况下,只⽣效其⼀,以 logging.file.name 为准
2.5.3 配置日志文件分割
如果我们的日志都放在⼀个⽂件中,随着项⽬的运行,日志⽂件会越来越⼤,需要对日志文件进行分割
配置项 | 说明 | 默认值 |
logging.logback.rollingpolicy.file-name-pattern | ⽇志分割后的⽂件名 格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
logging.logback.rollingpolicy.m ax-file-size | 日志文件超过这个大 小就自动分割 | 10MB |
Properties配置
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%ilogging.logback.rollingpolicy.max-file-size=1KB
yml配置
logging:file:path: C:/loggerlogback:rollingpolicy:file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%imax-file-size: 1KB
1. ⽇志⽂件超过1KB就分割(设置1KB是为了更好展示.企业开发通常设置为200M,500M等,此处没 有明确标准)
2. 分割后的⽇志⽂件名为:日志名.日期.索引
多次运行程序 查看日志分割效果
2.5.4 配置日志格式
打印日志的格式,也是支持配置的.支持控制台和日志文件分别设置
配置项 | 说明 | 默认值 |
logging.pattern.console | 控制台日志格式 | %clr(%d{S{LOG_DATEFORMAT_PATTERN:-yyyy-MM- dd'T'HH:mm:ss.SSSXXX)H){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{S{LOG_DATEFORMAT_PATTERN:-yyyy-MM- dd'T'HH:mm:Ss.SSSXXX}${LOG_LEVEL_PATTERN:-%5p}${PID:-} ---[%t] %-40.40logger{39] : %m%nS{LOG_EXCEPTION_CONVERSION_WORD:-%wEx} |
配置项说明:
1.%clr(表达式){颜色}设置输入日志的颜色
支持颜色有以下几种:
blue
cyan
faint
green
magenta
red
yellow
2.%d[S[LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}日期和时间--精确到毫秒
%d日期
${LOG_DATEFORMAT_PATTERN: -yyyy-MM-dd'T'HH: mm: SS.SSSXXX}非空表达式,获取
系统属性LOG_DATEFORMAT_PATTERN,若属性LOG_DATEFORMAT_PATTERN不存在,则使用-yyyy-MM-dd HH:mm:ss.SSSXXX 格式,系统属性可System.getProperty("LOG_DATEFORMAT_PATTERN")获取
3.%5p显示日志级别ERROR,MARN,INFO,DEBUG,TRACE.
4.%t线程名.%c类的全限定名.%Mmethod.%L为行号.%thread线程名称.%m或者%msg显示输出消息.%n换行符
5.%5若字符长度小于5,则右边用空格填充.%-5若字符长度小于5,则左边用空格填充.%.15若
字符长度超过15,截去多余字符.%15.15若字符长度小于15,则右边用空格填充.若字符长度超
过15,截去多余字符
更多说明,参考:https://logback.qos.ch/manual/layouts.html#conversionWord
修改控制台颜色显示
添加 VMoptions-Dspring.output.ansi.enabled=ALWAYS
在控制台中的显示
三 @Slf4j注解
3.1 添加lombok依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency>
3.2 输出日志
@Slf4j
@RestController
public class LoggerController {// private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@RequestMapping("/printLog")public String pringtLog() {log.info("---info---");return "打印不同级别的日志";}
}
lombok提供的 @Slf4j注解 会帮我们提供⼀个日志对象log,我们可以直接使用
相关文章:

八、Spring Boot 日志详解
目录 一、日志的用途 二、日志使用 2.1 打印日志 2.1.1 在程序中获取日志对象 2.1.2 使用日志对象打印日志 2.2、日志框架介绍 2.2.1 门面模式(外观模式) 2.2.2 门面模式的实现 2.2.3 SLF4J 框架介绍 2.3 日志格式的说明 2.4 日志级别 2.4.1 日志级别的分类 2.4.2…...
Java实战经验分享
1. 项目优化与性能提升 面试问题: 聊聊你印象最深刻的项目,或者做了哪些优化 你在项目中如何解决缓存穿透问题? 缓存穿透是我们做缓存优化时最常遇到的问题,特别是当查询的对象在数据库中不存在时,缓存层和数据库都会…...
前端控制器模式
前端控制器模式 概述 前端控制器模式(Front Controller Pattern)是一种设计模式,它将应用程序中的所有用户请求统一交由一个控制器处理。这种模式在MVC(Model-View-Controller)架构中尤为常见,它能够简化…...

Linux之安装docker
一、检查版本和内核是否合格 Docker支持64位版本的CentOS 7和CentOS 8及更高版本,它要求Linux内核版本不低于3.10。 检查版本 cat /etc/redhat-release检查内核 uname -r二、Docker的安装 1、自动安装 Docker官方和国内daocloud都提供了一键安装的脚本&#x…...

BUUCTF_XSS-Lab
xss XSS(Cross - Site Scripting)即跨站脚本攻击,是一种常见的 Web 安全漏洞。攻击者通过在目标网站注入恶意脚本(通常是 JavaScript),当其他用户访问该网站时,这些恶意脚本会在用户的浏览器中执…...

springBoot使用
1.什么是SpringBoot SpringBoot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。SpringBoot是伴随Spring4.0的时候发布的一个框架。SpringBoot用来简化Spring应用的开发,约定大于配置,去繁从简。 从本质上来说ÿ…...

DS图(中)(19)
文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下,我们来学习下图的中篇!!! 一、图的遍历 图的遍历指的是遍历图中的顶点,主要有 广度优先遍历 …...

Vue Dom截图插件,截图转Base64 html2canvas
安装插件 npm install html2canvas --save插件使用 <template><div style"padding: 10px;"><div ref"imageTofile" class"box">发生什么事了</div><button click"toImage" style"margin: 10px;&quo…...
Unity3D仿星露谷物语开发小结1
1、Cinemachine的作用及使用方法 (1)作用 控制Camera的模块,实现摄像机的复杂控制,比如角色的跟随,限制Camera的区域 (2)使用方法 在已有Main Camera的情况下, 通过【GameObject -&…...
graylog初体验
最近graylog比较火,部署了一个来测试下,看下后续能不能代替目前占用资源比较多的elk,目前未对graylog性能进行深入测试,只是简单体验了下,graylog的UI比较简陋,但是在报警以及权限方面优于ELK,整…...

15.PPT:文静-云计算行业发展【29】
目录 NO123 NO345 NO6 NO78 NO9/10/11/12 NO123 设计→幻灯片大小→自定义幻灯片大小→ 全屏显示(16:9)→最大化 NO345 SmartArt 主题颜色2/6/9:形状样式:样式 加大行距加宽间距 NO6 NO78 设计→设置背景…...

高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案
目录 一、Ollama 介绍 二、Ollama下载 2.1 官网下载 2.2 GitHub下载 三、模型库 四、Ollmal 使用 4.1 模型运行(下载) 4.2 模型提问 五、Ollama 常用命令 相关推荐 一、Ollama 介绍 Ollama是一个专为在本地机器上便捷部署和运行大型语言模型&…...
MFC 的 CListCtrl 控件,使用SetItemState 方法来设置选中某个 item,如何达到效果和鼠标点击一致
1)查询到的方法如下: // 假设你要选中第 2 行(索引从 0 开始) int nItem 1; // 取消所有其他选中项 m_ListCtrl.SetItemState(-1, 0, LVIS_SELECTED); // 设置选中状态,并确保它具有焦点 m_ListCtrl.SetItemStat…...
一文读懂:TCP网络拥塞的应对策略与方案
TCP(传输控制协议)是互联网中广泛使用的可靠传输协议,它通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制确保数据的可靠传输。然而,在网络环境中,由于多个主机共享网络资源,网络拥塞成为了一个…...

深度整理总结MySQL——子查询的工作原理
子查询的工作原理 前言为什么开发人员喜欢写子查询查询重写条件化简移除不必要的括号常量传递(constant_propagation)移除没用的条件(trivial_condition_removal)HAVING子句和WHERE子句的合并 常量表检测外连接消除 子查询子查询语…...
20240824 美团 笔试
文章目录 1、单选题1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.151.161.171.181.191.202、编程题2.12.2岗位:硬件开发工程师(嵌入式系统软件开发方向) 题型:20 道单选题,2 道编程题题 1、单选题 1.1 C 语言中,如果输入整数 v 是 2 的幂,下面表达式中哪个会返…...
Windows图形界面(GUI)-QT-C/C++ - QT 文本编辑控件详解
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 概述 1. QLineEdit 1.1 特点 1.2 属性 1.3 常用方法 1.4 拓展应用 2. QTextEdit 2.1 特点 2.2 属性 2.3 常用方法 2.4 拓展应用 3. QPlainTextEdit 3.1 特点 3.2 属性 3.3…...
IDEA中Resolving Maven dependencies卡着不动解决方案
一、修改settings.xml Maven配置阿里云仓库主要通过修改Maven的settings.xml文件来实现。以下是具体步骤: 1、找到settings.xml文件: 通常位于Maven安装目录下的conf文件夹中,或者在用户目录下的.m2文件夹中(如果用户自定义了settings.xml的位置)。 2、编辑se…...

go数据结构学习笔记
本博文较为完整的实现了go的链表、栈,队列,树,排序,链表包括顺序链表,双向链表,循环链表,队列是循环队列,排序包含冒牌、选择 1.链表 1.1 顺序链表 type LNode struct {data intn…...

【后端开发】系统设计101——Devops,Git与CICD,云服务与云原生,Linux,安全性,案例研究(30张图详解)
【后端开发】系统设计101——Devops,Git与CICD,云服务与云原生,Linux,安全性,案例研究(30张图详解) 文章目录 1、DevopsDevOps与SRE与平台工程的区别是什么?什么是k8s(Ku…...

解决数据库重启问题
最近部署软件时,发现mysql会一直在重启,记录下解决办法: 1.删除/home/dataexa/install/docker/datas/mysql路径下的data文件夹 2.重新构建mysql docker-compose up -d --build mysql 3.停掉所有应用,在全部重启: do…...

通道注意力
一、 什么是注意力 其中注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器,就像人类视觉会自动忽略背景,聚焦于图片中的主体(如猫、汽车)。 transformer中的叫做自注意力机制,他是一种自己学习自己的机制…...

Python: 操作 Excel折叠
💡Python 操作 Excel 折叠(分组)功能详解(openpyxl & xlsxwriter 双方案) 在处理 Excel 报表或数据分析时,我们常常希望通过 折叠(分组)功能 来提升表格的可读性和组织性。本文将详细介绍如何使用 Python 中的两个主流 Excel 操作库 —— openpyxl 和 xlsxwriter …...

1、Go语言基础中的基础
摘要:马士兵教育的Go语言基础的视频笔记。 第一章:走进Golang 1.1、Go的SDK介绍 1.2、Go的项目基本目录结构 1.3、HelloWorld 1.4、编译 1.5、执行 1.6、一步到位 1.7、执行流程分析 1.8、语法注意事项 (1)源文件以"go&qu…...

K8s基础一
Kubernetes 架构 Kubernetes 背后的架构概念。 Kubernetes 集群由一个控制平面和一组用于运行容器化应用的工作机器组成, 这些工作机器称作节点(Node)。每个集群至少需要一个工作节点来运行 Pod。 工作节点托管着组成应用负载的 Pod。控制平…...

Linux配置yum 时间同步服务 关闭防火墙 关闭ESlinux
1、配置yum 1.1、Could not resolve host: mirrorlist.centos.org; 未知的错误 https://blog.csdn.net/fansfi/article/details/146369946?fromshareblogdetail&sharetypeblogdetail&sharerId146369946&sharereferPC&sharesourceRockandrollman&sharefr…...

创客匠人:以 AI 利器赋能创始人 IP 打造,加速知识变现新路径
在知识付费与个人 IP 崛起的时代,创客匠人作为行业领先的技术服务商,正通过 AI 工具重构创始人 IP 打造与知识变现的生态。其推出的三大 AI 利器 ——AI 销售信、免训数字人、AI 智能客服,精准解决 IP 运营中的核心痛点。 以 AI 销售信为例&…...

关于安科瑞APD局部放电监测装置解决方案的应用分析
1 什么是局部放电? 局部放电(Partial Discharge, PD)是指发生在电气设备绝缘系统局部区域的、未贯穿整个电极的微小放电现象。它通常发生在高压电气设备(如变压器、开关柜、电缆、GIS等)内部存在绝缘缺陷、电场集中或…...
Ubuntu中常用的网络命令指南
Ubuntu中常用的网络命令指南 在Ubuntu系统中,网络管理是日常运维和故障排查的核心技能。 🛠️ 基础网络诊断 ping - 测试网络连通性 ping google.com # 持续测试 ping -c 4 google.com # 发送4个包后停止traceroute / tracepath - 追踪数据包路径 …...

我用Amazon Q写了一个Docker客户端,并上架了懒猫微服商店
自从接触了Amazon Q,我陆陆续续写了不少小软件,其中这个项目是一个典型的例子,自己平时来使用,也分享给一些 NAS 爱好者来用。 故事还要用上次折腾黑群晖说起,本意想把 NAS 和打印机共享二合一的,所以把闲着…...