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

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

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

相关文章

python:求解爱因斯坦场方程

在物理学中&#xff0c;爱因斯坦的广义相对论&#xff08;General Relativity&#xff09;是描述引力如何作用于时空的理论。广义相对论由爱因斯坦在1915年提出&#xff0c;并被阿尔伯特爱因斯坦、纳森罗森和纳尔逊曼德尔斯塔姆共同发展。广义相对论的核心方程是爱因斯坦场方程…

25寒假算法刷题 | Day1 | LeetCode 240. 搜索二维矩阵 II,148. 排序链表

目录 240. 搜索二维矩阵 II题目描述题解 148. 排序链表题目描述题解 240. 搜索二维矩阵 II 点此跳转题目链接 题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到…

014-STM32单片机实现矩阵薄膜键盘设计

1.功能说明 本设计主要是利用STM32驱动矩阵薄膜键盘&#xff0c;当按下按键后OLED显示屏上会对应显示当前的按键键值&#xff0c;可以将此设计扩展做成电子秤、超市收银机、计算器等需要多个按键操作的单片机应用。 2.硬件接线 模块管脚STM32单片机管脚矩阵键盘行1PA0矩阵键盘…

将ollama迁移到其他盘(eg:F盘)

文章目录 1.迁移ollama的安装目录2.修改环境变量3.验证 背景&#xff1a;在windows操作系统中进行操作 相关阅读 &#xff1a;本地部署deepseek模型步骤 1.迁移ollama的安装目录 因为ollama默认安装在C盘&#xff0c;所以只能安装好之后再进行手动迁移位置。 # 1.迁移Ollama可…

提升RAG效果:为何 JSON 格式远胜 Markdown?

在构建强大的 RAG (检索增强生成) 系统时&#xff0c;文档解析是至关重要的第一步。它直接影响着后续的检索效率和生成质量。在众多文档格式中&#xff0c;JSON (JavaScript Object Notation) 格式正逐渐展现出其相对于传统 Markdown 格式的巨大优势。本文将深入探讨 JSON 在 R…

CMake的QML项目中使用资源文件

Qt6.5的QML项目中&#xff0c;我发现QML引用资源文件并不像QtWidgets项目那样直接。 在QtWidgets的项目中&#xff0c;我们一般是创建.qrc​资源文件&#xff0c;然后创建前缀/new/prefix​&#xff0c;再往该前缀中添加一个图片文件&#xff0c;比如&#xff1a;test.png​。…

在K8S中,有哪几种控制器类型?

在Kubernetes中&#xff0c;控制器&#xff08;Controller&#xff09;是用来确保实际集群状态与所需状态保持一致的关键组件。它们监控并自动调整系统以达到预期状态&#xff0c;以下是Kubernetes中主要的几种控制器类型&#xff1a; ReplicationController&#xff08;RC&am…

680.验证回文串||

解题思路 最多删除一个字符使其成为回文串&#xff0c;首先根据回文串的特点&#xff0c;即两边互相对应。 因此判断的方法可以有两种&#xff1a; 翻转后两个字符串相同&#xff0c;是回文串使用双指针进行判断 这里需要涉及删除&#xff0c;因此使用双指针&#xff0c;l和…

SAP HCM 回溯分析

最近总有人问回溯问题&#xff0c;今天把12年总结的笔记在这共享下&#xff1a; 12年开这个图的时候总是不明白是什么原理&#xff0c;教程看N次&#xff0c;网上资料找一大堆&#xff0c;就是不明白原理&#xff0c;后来为搞明白逻辑&#xff0c;按照教材的数据一样做&#xf…

强化学习笔记(5)——PPO

PPO视频课程来源 首先理解采样期望的转换 变量x在p(x)分布下&#xff0c;函数f(x)的期望 等于f(x)乘以对应出现概率p(x)的累加 经过转换后变成 x在q(x)分布下&#xff0c;f(x)*p(x)/q(x) 的期望。 起因是&#xff1a;求最大化回报的期望&#xff0c;所以对ceta求梯度 具体举例…

如何处理 Typecho Joe 主题被抄袭或盗版的问题

在开源社区中&#xff0c;版权保护是一个非常重要的话题。如果你发现自己的主题&#xff08;如 Joe 主题&#xff09;被其他主题&#xff08;如子比主题&#xff09;抄袭或盗版&#xff0c;你可以采取以下措施来维护自己的权益。 一、确认侵权行为 在采取任何行动之前&#xf…

chatGPT写的网页版贪吃蛇小游戏

chatGPT写的网页版贪吃蛇小游戏 前言网页版贪吃蛇小游戏 前言 之前无聊&#xff0c;让ChatGPT写了一段基于html语言的贪吃蛇小游戏代码 网页版贪吃蛇小游戏 将以下内容复制到记事本&#xff0c;重命名为xxx.html即可打开浏览器游玩 这里是一个使用HTML、CSS和JavaScript编写…

Linux第105步_基于SiI9022A芯片的RGB转HDMI实验

SiI9022A是一款HDMI传输芯片&#xff0c;可以将“音视频接口”转换为HDMI或者DVI格式&#xff0c;是一个视频转换芯片。本实验基于linux的驱动程序设计。 SiI9022A支持输入视频格式有&#xff1a;xvYCC、BTA-T1004、ITU-R.656&#xff0c;内置DE发生器&#xff0c;支持SYNC格式…

人机交互系统实验三 多通道用户界面

实验目的和要求 1)了解常见的多通道用户界面 2)查找资料&#xff0c;熟悉一种多通道用户界面并写出综述 实验环境 Windows10 实验内容与过程 (一) 实验内容: 要求上网查找资料&#xff0c;熟悉一种多通道用户界面并写出综述&#xff0c;可以是眼动跟踪、手势识别、 三维…

SQL进阶实战技巧:某芯片工厂设备任务排产调度分析 | 间隙分析技术应用

目录 0 技术定义与核心原理 1 场景描述 2 数据准备 3 间隙分析法 步骤1:原始时间线可视化

ANSYS Workbench打开cdb文件

背景&#xff1a; 前面一篇文章已经说过ANSYS Mechanical APDL打开cdb文件-CSDN博客&#xff0c;经典ANSYS界面可以打开HyperMesh中生成的cdb文件&#xff0c;如果是workbench&#xff0c;那么该如何操作&#xff1f; 方法&#xff1a; 首先打开ANSYS的workbench软件&#xf…

Java多线程——对象的组合

设计线程安全的类 找出构成对象状态的所有变量找出约束状态变量的不变性条件建立对象状态的并发访问管理策略 实例封闭 当一个对象被封装到另一个对象中&#xff0c;能够访问被封装对象的所有代码路径都是已知的。 通过封闭和加锁&#xff0c;可以确保以线程安全的方式使用…

在K8S中,如何把某个worker节点设置为不可调度?

在Kubernetes中&#xff0c;如果你想要把一个worker节点设置为不可调度&#xff0c;意味着你不想让Kubernetes调度器在这个节点上调度新的Pod。这通常用于维护或升级节点&#xff0c;或者当节点遇到硬件故障或性能问题时&#xff0c;要将某个worker节点设置为不可调度。 方法1…

计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战

前一篇文章&#xff0c;Tensor 基本操作5 device 管理&#xff0c;使用 GPU 设备 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started PyTorch 计算图和 Autograd 微积分之于机器学习Computational Graphs 计算图Autograd…

探秘Linux IO虚拟化:virtio的奇幻之旅

在当今数字化时代&#xff0c;虚拟化技术早已成为推动计算机领域发展的重要力量。想象一下&#xff0c;一台物理主机上能同时运行多个相互隔离的虚拟机&#xff0c;每个虚拟机都仿佛拥有自己独立的硬件资源&#xff0c;这一切是如何实现的呢&#xff1f;今天&#xff0c;就让我…