当前位置: 首页 > news >正文

2023.11.17 关于 Spring Boot 日志文件

目录

日志文件作用

常见的日志框架说明 

门面模式

日志的使用

日志的级别

六种级别

日志级别的设置

日志的持久化

使用 Lombok 输出日志

实现原理

普通打印和日志的区别


日志文件作用

  • 记录 错误日志 和 警告日志(发现和定位问题)
  • 记录 用户登录日志,分析用户是否正常登录
  • 记录 系统操作日志,方便 数据恢复 和 定位操作人
  • 记录程序执行时间,方便以后为优化程序提供数序支持

常见的日志框架说明 

门面模式

  • 设计模式的一种
  • 门面模式就是一种通过引入一个简化接口来隐藏复杂细系统的设计模式,它提供了一种简单的方式让客户端与系统进行交互,同时降低了客户端和系统之间的耦合度

简单理解

  • 日志系统有多个,即多个不同的框架,框架的本质是多个工具类的集合
  • 不同的框架有着不同的类名,不同的类名也有着不同的方法名
  • 所以 Log4j、JUL、Logback、Slf4j-Simple 这些日志系统的写法完全一点边都不沾

导致问题

  • 如果此时直接在应用程序中以 Log4j 日志系统为基本进行日志操作
  • 有一天 Log4j 日志系统 出现了严重 bug,需要将该应用程序的 日志系统 改为 Logback 时
  • 因为这两个日志系统的写法完全一点边不沾,所以此时应用程序中需要修改代码就会很多很多

解决方法

  • 引入日志门面
  • 我们按照 日志门面 所提供的写法来写日志操作代码
  • 然后 日志门面 会根据程序员的配置 和 程序员引入的驱动 来操作最底层的日志系统
  • 通过该方式便可轻松切换日志系统
  • 从而很大程度上降低了应用程序和日志系统的耦合度

  • Spring Boot 内置的日志门面是 Slf4j 、日志系统是 Logback

日志的使用

得到日志对象

  • 在 TestController 类中使用日志工厂 LoggerFactory 获取日志对象
  • 日志在程序运行期间只加载一次,并且不可变,所以使用 static 和 final 修饰
//    1.得到日志对象private static final Logger log = LoggerFactory.getLogger(TestController.class);

注意:

  • Logger 有很多一定要选择导入下图红框的包


使用日志对象提供的方法打印日志

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@ResponseBody // 加在类上,表示当前类中的所有方法返回的都是非静态页面的数据
@RequestMapping("/test") // = @WebServlet("/url")
public class TestController {
//    1.得到日志对象private static final Logger log = LoggerFactory.getLogger(TestController.class);@RequestMapping("/say-hi") // = @WebServlet("/url")public String sayHi() {
//        2.打印日志log.trace("i am trace");log.debug("i am debug");log.info("i am info");log.warn("i am warn");log.error("i am error");return "hello world ";}
}

运行结果:

  • 先在浏览器中访问下图路径

  • 再观察控制台输出的日志信息

  • 我们自定义打印的日志信息有五条
  • 在上图运行结果中,控制台却仅打印了后三条日志信息
  • 因为此时 Spring Boot 默认打印的日志级别为 info 级别
  • 即 大于或等于 info 级别的日志信息才会打印出来

日志的级别


六种级别

trace

  • 微量,少许的意思级别最低

debug

  • 需要调试的时候的关键信息打印

info

  • 普通的打印信息,默认日志级别

warn

  • 警告,不影响使用,但需要注意的问题

error

  • 错误信息,级别较高的错误日志信息

fatal

  • 致命的,因为代码异常导致程序退出执行的事件

日志级别的设置

  • 日志输出的默认级别是 info
  • 我们可以在配置文件中手动配置默认日志输出级别
  • 在配置文件 application.yml 中,加入下段配置代码即可
logging:level:root: warn
  • 上述配置代码的作用域为根目录(root)下的所有包
  • 表示设置根日志记录器的级别为 warn
  • 这意味着,应用程序中所有的日志记录器都将继承这个级别
  • 除非它们已经被明确地设置了其他级别

运行结果:

  • 如果我们想设置指定某一包下的日志输出级别
  • 可按下图方式添加配置代码

  • 红框路径以 java 目录为起始目录

运行结果:

  • 明确指定某一包下的日志输出级别的优先级高于 使用 root 指定根目录下所有包的日志输出级别

日志的持久化

  • 上述日志的仅在控制台输出
  • 在生产环境中我们需要将日志保存下来
  • 以便出现问题后可以追溯问题

两种方式

指定日志的存储目录

  • 启动 Spring Boot 后
  • 在 E盘的 test 目录下的 testDemo 目录下会出现日志文件
  • 如果启动前无该路径,启动后便会自动创建出该路径
logging:file:path: E://test//testDemo

指定日志文件的文件名

  • 启动 Spring Boot 后
  • 会在指定目录下生产一个名为 spring-log.log 的日志文件
logging:file:path: E://test//testDemo//spring-log.log

注意点一:

  • 在Spring Boot 中进行日志记录时
  • 如果没有指定日志文件的名称 或 两次保存的日志指定了相同的文件名
  • 那么第二次运行Spring Boot 时,其保存的日志信息会被追加到第一次保存的日志文件后面,而不是覆盖第一次保存的日志信息
  • 因为 Spring Boot 的日志系统默认是以 追加模式 来写入日志的
  • 也就是说每次写入日志时,都会在原有日志的基础上添加新的日志信息,而不会删除或覆盖原有的日志

注意点二:

  • 日志文件的大小通常会有一个上限
  • 这是为了防止日志文件过大导致加载速度变慢
  • 当日志文件达到一定大小后,Spring Boot 会自动创建一个新的日志文件
  • 以防止单个日志文件过大
  • 通过下段配置代码,可以实现手动配置日志文件的大小上线
logging:file:path: E://test//testDemo//spring-log.logmax-size: 10MB
  • 该段配置代码将日志文件的大小上限设置为 10MB

使用 Lombok 输出日志

实例理解

  • 我们在 EasyController 类上加 @Slfj 注解
  • 即可直接在该类中使用 log 对象
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@ResponseBody
@Slf4j
public class EasyController {@RequestMapping("/test/easy")public void sayHi() {log.error("i am error");}
}

实现原理

  • Java 程序在 IDEA 中执行完后会生产一个 target 文件
  • 该文件为源代码完成去掉注释等一系列工作后的文件
  • 且该文件就是该项目执行的最终代码

  • 我们发现 lombok的事件原理就是在编译阶段加上了我们原本需要的代码

普通打印和日志的区别

最关键的两个区别

  • 普通打印 没有级别的控制,无法进行信息的筛选
  • 普通打印  不支持持久化,无法保存下来

相关文章:

2023.11.17 关于 Spring Boot 日志文件

目录 日志文件作用 常见的日志框架说明 门面模式 日志的使用 日志的级别 六种级别 日志级别的设置 日志的持久化 使用 Lombok 输出日志 实现原理 普通打印和日志的区别 日志文件作用 记录 错误日志 和 警告日志(发现和定位问题)记录 用户登录…...

【框架整合】Redis限流方案

1、Redis实现限流方案的核心原理&#xff1a; redis实现限流的核心原理在于redis 的key 过期时间&#xff0c;当我们设置一个key到redis中时&#xff0c;会将key设置上过期时间&#xff0c;这里的实现是采用lua脚本来实现原子性的。2、准备 引入相关依赖 <dependency>…...

NSS [鹤城杯 2021]Middle magic

NSS [鹤城杯 2021]Middle magic 源码直接给了。 粗略一看&#xff0c;一共三个关卡 先看第一关&#xff1a; if(isset($_GET[aaa]) && strlen($_GET[aaa]) < 20){$aaa preg_replace(/^(.*)level(.*)$/, ${1}<!-- filtered -->${2}, $_GET[aaa]);if(preg_m…...

Sqlite安装配置及使用

一、下载SQLite Sqlite官网 我下载的是3370000版本:sqlite-dll-win64-x64-3370000.zip 和 sqlite-tools-win32-x86-3370000.zip 二、解压下载的两个压缩包 三、配置环境 四、检查是否安装配置成功 winR&#xff1a;输入cmd调出命令窗口&#xff0c;输入sqlite3后回车查看s…...

参数估计(一)(点估计)

文章目录 点估计和估计量的求法点估计概念矩估计法极大似然估计法 参考文献 参数估计是数理统计中重要的基本问题之一。通常&#xff0c;称参数的可容许值的全体为参数空间&#xff0c;并记为 Θ \Theta Θ。所谓参数估计就是由样本对总体分布所含的未知参数做出估计。另外&am…...

kubenetes-服务发现和负载均衡

一、服务发布 kubenetes把服务发布至集群内部或者外部&#xff0c;服务的三种不同类型&#xff1a; ClusterlPNodePortLoadBalancer ClusterIP是发布至集群内部的一个虚拟IP,通过负载均衡技术转发到不同的pod中。 NodePort解决的是集群外部访问的问题&#xff0c;用户可能不…...

docker的基本使用以及使用Docker 运行D435i

1.一些基本的指令 1.1 容器 要查看正在运行的容器&#xff1a; sudo docker ps 查看所有的容器&#xff08;包括停止状态的容器&#xff09; sudo docker ps -a 重新命名容器 sudo docker rename <old_name> <new_name> <old_name> 替换为你的容器名称…...

如何看待人工智能行业发展

随着人工智能技术的飞速发展&#xff0c;这个领域的就业前景也日益广阔。人工智能在各行各业都有广泛的应用&#xff0c;包括医疗、金融、制造业、教育等。因此&#xff0c;对于想要追求高薪、高技能职业的人来说&#xff0c;学习人工智能是一个非常有前景的选择。 首先&#x…...

linux中实现自己的bash

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…...

14 Go的类型转换

概述 在上一节的内容中&#xff0c;我们介绍了Go的错误处理&#xff0c;包括&#xff1a;errors包、返回错误、抛出异常、捕获异常等。在本节中&#xff0c;我们将介绍Go的类型转换。在Go语言中&#xff0c;类型转换是一种将一个值从一种类型转换为另一种类型的过程。类型转换主…...

多线程概述

文章目录 线程是什么线程有什么作用线程和进程的区别多线程相较于进程优势 在Java这个圈子中,多进程用的并不多,因为进程是一个重量级操作,进程是资源分配的基本单位,申请资源是一个比较消耗时间的操作. 线程是什么 线程是一个独立的执行流,可以被独立调度到CPU上执行 线程是…...

AR贴纸特效SDK,无缝贴合的虚拟体验

增强现实&#xff08;AR&#xff09;技术已经成为了企业和个人开发者的新宠。它通过将虚拟元素与现实世界相结合&#xff0c;为用户提供了一种全新的交互体验。然而&#xff0c;如何将AR贴纸完美贴合在人脸的面部&#xff0c;同时支持多张人脸的检测和标点及特效添加&#xff0…...

Leetcode hot 100

双指针 283.移动零 class Solution { public:void moveZeroes(vector<int>& nums) {int cnt 0;for(vector<int>::iterator it nums.begin(); it ! nums.end(); ){if(*it 0) it nums.erase(it),cnt;else it;}while(cnt--){nums.push_back(0);}} }; 11.盛…...

分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测

分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测 目录 分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测&#xff08;完整源码和数据) 2.多…...

矩阵运算_矩阵的协方差矩阵/两个矩阵的协方差矩阵_求解详细步骤示例

1. 协方差矩阵定义 在统计学中&#xff0c;方差是用来度量单个随机变量的离散程度&#xff0c;而协方差则一般用来刻画两个随机变量的相似程度。 参考&#xff1a; 带你了解什么是Covariance Matrix协方差矩阵 - 知乎 2. 协方差矩阵计算过程 将输入数据A进行中心化处理得到A…...

100天精通Python(可视化篇)——第108天:Pyecharts绘制多种炫酷词云图参数说明+代码实战

文章目录 专栏导读一、词云图介绍1. 词云图是什么?2. 词云图应用场景?二、参数说明1. 导包2. add函数三、词云库实战1. 基础词云图2. 矩形词云图3. 三角形词云图4. 菱形词云图5. 自定义图片词云图书籍推荐专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本…...

Spark 平障录

Profile Profile 是最重要的第一环。 利用好 spark UI 和 yarn container log分析业务代码&#xff0c;对其计算代价进行预判建设基准&#xff0c;进行对比&#xff0c;比如application id 进行对比&#xff0c;精确到 job DAG 环节 充分利用 UI Stage 页面 页头 summary&…...

基于一致性算法的微电网分布式控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 本模型主要是基于一致性理论的自适应虚拟阻抗、二次电压补偿以及二次频率补偿&#xff0c;实现功率均分&#xff0c;保证电压以及频率稳定性。 一致性算法 分布式一致性控制主要分为两类&#xff1a;协调同…...

Android 10.0 系统修改usb连接电脑mtp和PTP的显示名称

1.前言 在10.0的产品定制化开发中,在usb模块otg连接电脑,调整为mtp文件传输模式的时候,这时可以在电脑看到手机的内部存储 显示在电脑的盘符中,会有一个mtp名称做盘符,所以为了统一这个名称,就需要修改这个名称,接下来分析下处理的 方法来解决这个问题 2.系统修改usb连…...

飞鼠异地组网工具实战之访问k8s集群内部服务

飞鼠异地组网工具实战之访问k8s集群内部服务 一、飞鼠异地组网工具介绍1.1 飞鼠工具简介1.2 飞鼠工具官网 二、本次实践介绍2.1 本次实践场景描述2.2 本次实践前提2.3 本次实践环境规划 三、检查本地k8s集群环境3.1 检查k8s各节点状态3.2 检查k8s版本3.3 检查k8s系统pod状态 四…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

uniapp获取当前位置和经纬度信息

1.1. 获取当前位置和经纬度信息&#xff08;需要配置高的SDK&#xff09; 调用uni-app官方API中的uni.chooseLocation()&#xff0c;即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…...

Centos 7 服务器部署多网站

一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站&#xff0c;目录结构如下&#xff1a; bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...