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中的错误可以分为…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
