Spring Boot——日志介绍和配置
1. 日志的介绍
在前面的学习中,控制台上打印出来的一大堆内容就是日志,可以帮助我们发现问题,分析问题,定位问题,除此之外,日志还可以进行系统的监控,数据采集等

2. 日志的使用
在程序中获取日志对象需要使用日志工厂 LoggerFactory,然后调用 getLogger 方法,传入参数用来标识这个日志的名称,这样可以更清晰的知道是哪个类输出的日志
private static Logger logger = LoggerFactory.getLogger(CaptchaController.class);
System.out.println("System:" + code);
logger.info("Logger: " + code);

来看一下日志的格式:


应用名称可以在配置文件中进行配置
3. 日志框架的介绍
日志门面就相当于是淘宝 APP,日志实现相当于入驻的商家,在使用时是使用淘宝,真正提供商品的还是商家
也就是使用时使用 SLF4J,真正实现功能还是日志实现的框架

3.1. SLF4J 框架的介绍
SLF4J 就是其他日志框架的门面,相当于提供日志服务的统一 API 接口,并不涉及到具体的日志逻辑实现,而是一个抽象层,对日志框架制定的一种规范、标准、接口。所有 SLF4J 并不能独立使用,需要和具体的日志框架配合使用。
如果说不引入 SLF4J 的话
- 不同的日志框架的 API 接口和配置文件不同,如果多个日志框架共存,那么就需要维护多套配置文件
- 如果要更换日志框架,修改应用程序代码的过程中可能会出现一些代码冲突
- 如果引入了多套第三方框架,也是需要维护这些配置的
引入门面日志框架之后,应用程序和日志框架之间有了统一的 API 接口,此时应用程序只需要维护一套日志文件配置即可,当底层实现框架改变时,也不需要修改应用程序代码
3.2. 外观模式
外观模式(门面模式)提供了一个统一的接口,用来访问子系统中的其他接口

SLF4J 就是外观模式的典型应用,但不仅仅使用了这一种设计模式
接下来以开灯的例子简单实现一下外观模式:
首先定义一个接口:
public interface Light {void on();void off();
}
然后定义两个实现类:
public class LivingRoomLight implements Light{private static Logger logger = LoggerFactory.getLogger(LivingRoomLight.class);@Overridepublic void on() {logger.info("打开客厅灯");}@Overridepublic void off() {logger.info("打开客厅灯");}
}
public class BedroomLight implements Light{private static Logger logger = LoggerFactory.getLogger(BedroomLight.class);@Overridepublic void on() {logger.info("打开卧室灯");}@Overridepublic void off() {logger.info("打开卧室灯");}
}
如果说是之前的实现模式的话,需要在 Main 方法中去分别创建这两个类的对象,然后调用方法,通过外观模式的话,可以创建一个类,用来实现之前的过程
public class LightFacade {void lightOn(){LivingRoomLight livingRoomLight = new LivingRoomLight();livingRoomLight.on();BedroomLight bedroomLight = new BedroomLight();bedroomLight.on();}
}
这样,即使实现类的方法发生改变,提供给用户使用的接口还是不变的,用户就不用考虑内部是怎么实现的
4. 日志的级别
4.1. 级别的分类
日志的级别从高到低依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE。
- FATAL:致命信息,表示需要立即被处理的系统级错误。
- ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行。
- WARN:警告信息,不影响使用,但需要注意的问题。
- INFO:普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成等。
- DEBUG:调试信息,需要调试时候的关键信息打印。
- TRACE:追踪信息,比 DEBUG 更细粒度的信息事件(除非有特殊用意,否则请使用 DEBUG 级别替代)

4.2. 级别的使用
创建 Logger 之后就可以调用方法区打印不同级别的日志,但是发现没有 fatal 级别的信息,因为出现这个问题已经很严重了,不用通过日志就可以知道出现问题了

运行之后发现 debug 级别和 trace 级别的日志没有打印出来,这是因为默认配置的日志级别是 info 级别的,所以比 info 级别低的就打印不出来

5. 日志的配置
5.1. 配置日志级别
可以通过配置日志级别来设置

配置之后就可以看到级别低的日志了

也可以分类配置日志的级别,指定某个类的日志级别显示
logging:level:root: infocom:example:log:controller: trace
5.2. 日志持久化
在上面打印的日志中,如果把 idea 关了,那么之前打印的日志就没有了,如果说日志可以存储到文件中,也就是存储在硬盘上,就可以做到持久化,这样出现问题就可以查之前的日志
还是可以通过配置,来实现日志的持久化
第一种方式是通过配置文件名的方式

配置之后再运行的话,就会创建配置的文件夹和文件名,并且日志也存储在了文件中

还有一种方式是只设置路径

配置之后就会在设置的目录下创建一个 spring.log 文件夹,里面存储的就是日志信息

5.3. 配置日志文件的分割
如果说所有日志都放在同一个文件中,那么这个文件肯定是越来越大的,就需要对日志文件进行分割,日志框架默认也设置了如果超过 10 M 就会分割

先来设置为 1KB 进行分割

分割之后的文件名也是可以指定的
logback:rollingpolicy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
5.4. 配置日志格式
日志的格式也是可以控制的,

- % clr (表达式){颜色} 设置输入日志的颜色。
- % d {${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} 日期和时间 -- 精确到毫秒。
- %5p 显示日志级别 ERROR,WARN,INFO,DEBUG,TRACE。
- % t 线程名。% c 类的全限定名。% M method。% L 为行号。% thread 线程名称。% m 或者 % msg 显示输出消息。% n 换行符。
- %5 若字符长度小于 5,则右边用空格填充。%-5 若字符长度小于 5,则左边用空格填充。%.15 若字符长度超过 15,截去多余字符。%15.15 若字符长度小于 15,则右边用空格填充。若字符长度超过 15,截去多余字符。
pattern:console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
6. lombok 简化日志输出
直接使用注解@Slf4j,然后就不用再创建 Logger 的对象了,直接就可以调用方法

主页
相关文章:
Spring Boot——日志介绍和配置
1. 日志的介绍 在前面的学习中,控制台上打印出来的一大堆内容就是日志,可以帮助我们发现问题,分析问题,定位问题,除此之外,日志还可以进行系统的监控,数据采集等 2. 日志的使用 在程序中获取日…...
Python实现全国岗位招聘信息可视化分析(源码+论文+部署讲解)
项目源码&数据源获取 利用Python实现全国岗位招聘信息可视化分析 项目背景: 1.为企业招聘决策提供科学的依据和参考,可以帮助人力资源部门、招聘机构和求职者了解当前的就业形势、行业趋势和人才需求,从而做出更明智的招聘和求职决策。…...
【真题笔记】16年系统架构设计师要点总结
【真题笔记】16年系统架构设计师要点总结 存储部件接口嵌入式处理器产品配置配置管理用户文档系统文档CMM(能力成熟度模型)螺旋模型敏捷软件开发的方法学软件工具面向对象的分析模型设计模型COP(面向构件的编程)构件原子构件模块S…...
2024 CSS保姆级教程二 - BFC详解
前言 - CSS中的文档流 在介绍BFC之前,需要先给大家介绍一下文档流。 我们常说的文档流其实分为定位流、浮动流、普通流三种。 1. 绝对定位(Absolute positioning) 如果元素的属性 position 为 absolute 或 fixed,它就是一个绝对定位元素。 在…...
Knowledge-refined Denoising Network for Robust Recommendation
Knowledge-refined Denoising Network for Robust Recommendation(Sigir23) 摘要 知识图(KG)包含丰富的边信息,是提高推荐性能和可解释性的重要组成部分。然而,现有的知识感知推荐方法直接在KG和用户-项目…...
轴流风机和后倾式风机的安装要求
后向离心风机风压大,风量足,安装方便。因为不需要蜗壳,所以风道往往需要自行设计,而风道的合理与否,大大影响了后向离心风机的效率。那么后向离心风机的安装技巧有哪些?怎样达到风机的最佳使用效果呢&#…...
代码笔录1
10-16 出入栈序列是否合法 // // Created by 86184 on 2024/10/16. // #include <stdio.h>//IIOOOIO int jude(char s[]) {int count 0, i 0;while (s[i] ! \0) {if (s[i] I) count;else if (s[i] O) count--;else return 0;if (count < 0) return 0;i;}if (cou…...
强网杯2024 Web WP
强网杯2024 参考链接:https://mp.weixin.qq.com/s/Mfmg7UsL4i9xbm3V3e5HMA https://mp.weixin.qq.com/s/vV_II8TpyaGL4HUlUS57RQ PyBlockly 源码: from flask import Flask, request, jsonify import re import unidecode import string import ast …...
《双指针篇》---盛最多水的容器_Java(中等但简单)
题目传送门 1.首先计算出暂时的盛水体积 2.求暂时体积和最大体积max的最大值 3.更新right和left。如果height[left] > height[right] 那么right--否则left; class Solution {public int maxArea(int[] height) {int left 0,right height.length-1; int ret 0;while (lef…...
Linux: network: 环境:网络burst的一个原因,虚拟机感染病毒导致,外部网络设备太忙
最近碰到一个问题,测试人员在测试一周内的产品稳定性,带有的业务非常大。 总是不能满足需要的时长,总是在一段时间内出现丢包,业务出现错误的现象。从tshark/tcpdump的抓包看,确实在某个时间段,有一次十几秒…...
idea使用Translation插件实现翻译
1.打开idea,settings,选择plugins,搜索插件Translation,安装 2.选择翻译引擎 3.配置引擎,以有道词典为例 3.1 获取应用ID,应用秘钥 3.1.1 创建应用 点击进入有道智云控制台 3.1.2 复制ID和秘钥 3.2 idea设…...
[OS] sys_mmap() 函数+
流程图分析 1. 调用 sys_mmap() 步骤:当用户程序调用 mmap() 时,操作系统会进入 sys_mmap() 函数。作用:这是整个 mmap() 操作的入口。系统调用的实现从这里开始。 2. 提取参数(Fetch Argument) 步骤:从…...
轧钢机辊道多电动机传动控制系统
轧钢机辊道多电动机传动控制系统是一种复杂的工业自动化系统,主要用于控制轧钢车间中多个电动机驱动的辊道,以实现轧件的高效、稳定输送和加工。以下是对该系统的详细介绍: 系统组成 轧线辊道TDC控制器:作为系统的核心控制单元&a…...
使用 Nginx 部署 Python 项目
今天的目标是完成一个 Python Web 项目的线上部署,我们使用最新的 Django 项目搭建一个简易的 Web 工程,然后基于 Nginx 服务部署该 Python Web 项目。 1. 前期准备 1.1 安装虚拟环境pyenv 使用虚拟环境逐渐成了 python 项目开发中的一种主流方式。py…...
[笔记] SQL 优化
一. 数据库设计优化 1. 选择合适的字段类型 设计表时,尽量选择存储空间小的字段类型: 整型字段:从TINYINT、SMALLINT、INT到BIGINT。小数类型:对于金额等需精确计算的数值使用DECIMAL,避免使用FLOAT和DOUBLE。字符串…...
【InfluxDB】InfluxDB 2.x基础概念及原理
InfluxDB简介 什么是时序数据库 时序数据库,全称时间序列数据库(Time Series Database,TSDB),用于存储大量基于时间的数据。时序数据库支持时序数据的快速写入、持久化,多维度查询、聚合等操作࿰…...
.net Core 使用Panda.DynamicWebApi动态构造路由
我们以前是通过创建controller来创建API,通过controller来显示的生成路由,这里我们讲解下如何不通过controller,构造API路由 安装 Panda.DynamicWebApi 1.2.2 1.2.2 Swashbuckle.AspNetCore 6.2.3 6.2.3添加ServiceAction…...
Spring框架和Spring Boot框架都使用注解来简化配置和提高开发效率,但它们之间存在一些区别
Spring框架和Spring Boot框架都使用注解来简化配置和提高开发效率,但它们之间存在一些区别: Spring框架注解: Autowired:自动导入对象到类中,被注入的类需要被Spring容器管理。Component、Repository、Service、Contro…...
从数据提取到管理:TextIn平台的全面解析与产品体验
一、引言 在现代信息时代,文档解析和管理已经成为企业和开发者不可或缺的工具。TextIn是合合信息旗下的一款智能文档处理平台,为开发者和企业提供高效、精准的文档解析工具,帮助用户轻松应对各种复杂的文档处理需求。本文将深入探讨TextIn的…...
2024 Rust现代实用教程 Error错误处理
文章目录 一、错误处理之:Result、Option以及panic!宏1.Result2.Option3.panic! 二、错误处理之:unwrap()与?1.unwrap()2.?运算符 三、自定义一个Error类型参考 一、错误处理之:Result、Option以及panic!宏 Rust中的错误可以分为…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
