八、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. 分割后的⽇志⽂件名为:日志名.日期.索引

多次运行程序 查看日志分割效果

修改控制台颜色显示

添加  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,我们可以直接使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10977.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建前端项目的方法

目录 一、创建前端项目的方法 1.前提&#xff1a;安装Vue CLI 2.方式一&#xff1a;vue create项目名称 3.方式二&#xff1a;vue ui 二、Vue项目结构 三、修改Vue项目端口号的方法 一、创建前端项目的方法 1.前提&#xff1a;安装Vue CLI npm i vue/cli -g 2.方式一&…

(leetcode 213 打家劫舍ii)

代码随想录&#xff1a; 将一个线性数组换成两个线性数组&#xff08;去掉头&#xff0c;去掉尾&#xff09; 分别求两个线性数组的最大值 最后求这两个数组的最大值 代码随想录视频 #include<iostream> #include<vector> #include<algorithm> //nums:2,…

【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、字典 1.1、字典是什么 1.2、创建字典 1.3、查找 key 1.4、新增/修改元素 1.5、删除元素 1.6、遍历…

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操 Janus-Pro-7B介绍 Janus-Pro-7B 是由 DeepSeek 开发的多模态 AI 模型&#xff0c;它在理解和生成方面取得了显著的进步。这意味着它不仅可以处理文本&#xff0c;还可以处理图像等其他模态的信息。 模型主要特点:Permalink…

BW AO/工作簿权限配置

场景&#xff1a; 按事业部配置工作簿权限&#xff1b; 1、创建用户 事务码&#xff1a;SU01&#xff0c;用户主数据的维护&#xff0c;可以创建、修改、删除、锁定、解锁、修改密码等 用户设置详情页 2、创建权限角色 用户的权限菜单是通过权限角色分配来实现的 2.1、自定…

jstat命令详解

jstat 用于监视虚拟机运行时状态信息的命令&#xff0c;它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。 命令的使用格式如下。 jstat [option] LVMID [interval] [count]各个参数详解&#xff1a; option&#xff1a;操作参数LVMID&#xff1a;本…

3.Spring-事务

一、隔离级别&#xff1a; 脏读&#xff1a; 一个事务访问到另外一个事务未提交的数据。 不可重复读&#xff1a; 事务内多次查询相同条件返回的结果不同。 幻读&#xff1a; 一个事务在前后两次查询同一个范围的时候&#xff0c;后一次查询看到了前一次查询没有看到的行。 二…

MYSQL--一条SQL执行的流程,分析MYSQL的架构

文章目录 第一步建立连接第二部解析 SQL第三步执行 sql预处理优化阶段执行阶段索引下推 执行一条select 语句中间会发生什么&#xff1f; 这个是对 mysql 架构的深入理解。 select * from product where id 1;对于mysql的架构分层: mysql 架构分成了 Server 层和存储引擎层&a…

ReentrantReadWriteLock源码分析

文章目录 概述一、状态位设计二、读锁三、锁降级机制四、写锁总结 概述 ReentrantReadWriteLock&#xff08;读写锁&#xff09;是对于ReentranLock&#xff08;可重入锁&#xff09;的一种改进&#xff0c;在可重入锁的基础上&#xff0c;进行了读写分离。适用于读多写少的场景…

51单片机开发:温度传感器

温度传感器DS18B20&#xff1a; 初始化时序图如下图所示&#xff1a; u8 ds18b20_init(void){ds18b20_reset();return ds18b20_check(); }void ds18b20_reset(void){DS18B20_PORT 0;delay_10us(75);DS18B20_PORT 1;delay_10us(2); }u8 ds18b20_check(void){u8 time_temp0;wh…

vue2项目(一)

项目介绍 电商前台项目 技术架构&#xff1a;vuewebpackvuexvue-routeraxiosless.. 封装通用组件登录注册token购物车支付项目性能优化 一、项目初始化 使用vue create projrct_vue2在命令行窗口创建项目 1.1、脚手架目录介绍 ├── node_modules:放置项目的依赖 ├──…

labelme_json_to_dataset ValueError: path is on mount ‘D:‘,start on C

这是你的labelme运行时label照片的盘和保存目的地址的盘不同都值得报错 labelme_json_to_dataset ValueError: path is on mount D:,start on C 只需要放一个盘但可以不放一个目录

物联网 STM32【源代码形式-使用以太网】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

物联网&#xff08;IoT&#xff09;‌是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器等装置与技术&#xff0c;实时采集并连接任何需要监控、连接、互动的物体或过程&#xff0c;实现对物品和过程的智能化感知、识别和管理。物联网的核心功能包括数据采集与监…

无心剑七绝《深度求索》

七绝深度求索 深研妙理定乾坤 度世玄机启智门 求路千难兼万险 索萦华夏自为尊 2025年2月1日 平水韵十三元平韵 无心剑七绝《深度求索》以平水韵十三元平韵写成&#xff0c;意境深远&#xff0c;气势磅礴。诗中“深研妙理定乾坤”开篇点题&#xff0c;展现出对深奥道理的钻研与探…

Hot100之普通数组

53最大子数组和 题目 思路解析 我们用一个dp数组来收集我们从左往右&#xff0c;加起来的最大的和 也就是我们的节点不是负数&#xff0c;那我们直接收集就好了 如果是负数&#xff0c;我们就用Max&#xff08;&#xff09;比较是这个节点大还是当前节点大&#xff08;这个情…

如何利用天赋实现最大化的价值输出-补

原文&#xff1a; https://blog.csdn.net/ZhangRelay/article/details/145408621 ​​​​​​如何利用天赋实现最大化的价值输出-CSDN博客 如何利用天赋实现最大化的价值输出-CSDN博客 引用视频差异 第一段视频目标明确&#xff0c;建议也非常明确。 录制视频的人是主动性…

新能源算力战争:为什么AI大模型需要绿色数据中心?

新能源算力战争:为什么AI大模型需要绿色数据中心? 近年来,人工智能(AI)大模型的爆发式增长正在重塑全球科技产业的格局。以GPT-4、Gemini、Llama等为代表的千亿参数级模型,不仅需要海量数据训练,更依赖庞大的算力支撑。然而,这种算力的背后隐藏着一个日益严峻的挑战——…

Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)

目录 前言1. 基本知识2. Demo3. 实战代码 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&am…

unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等

目录 1 场景数量 SceneManager.sceneCount 2 直接代码生成新场景 SceneManager.CreateScene 3 场景的加载 3.1 用代码加载场景&#xff0c;仍然build setting里先加入配置 3.2 卸载场景 SceneManager.UnloadSceneAsync(); 3.3 同步加载场景 SceneManager.LoadScene 3.3.…

【Android】布局文件layout.xml文件使用控件属性android:layout_weight使布局较为美观,以RadioButton为例

目录 说明举例 说明 简单来说&#xff0c;android:layout_weight为当前控件按比例分配剩余空间。且单个控件该属性的具体数值不重要&#xff0c;而是多个控件的属性值之比发挥作用&#xff0c;例如有2个控件&#xff0c;各自的android:layout_weight的值设为0.5和0.5&#xff0…