2023.11.17 关于 Spring Boot 日志文件

news2024/9/23 22:34:49

目录

日志文件作用

常见的日志框架说明 

门面模式

日志的使用

日志的级别

六种级别

日志级别的设置

日志的持久化

使用 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.log
    max-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的事件原理就是在编译阶段加上了我们原本需要的代码

普通打印和日志的区别

最关键的两个区别

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

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

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

相关文章

web自动化测试的智能革命:AI如何推动软件质量保证的未来

首先这个标题不是我取的,是我喂了关键字让AI给取的,果然非常的标题党,让人印象深刻,另外题图也是AI自动生成的。 先简单回顾一下web自动化测试的一些发展阶段 QTP时代 很多年前QTP横空出世的时候,没有人会怀疑这种工…

【项目管理】中途接手的项目应对实用指南

导读:作为项目经理中途接手项目往往不可避免,为了保证项目成功需要项目经理额外考虑更多的因素和处理相关问题,也往往带来很大的挑战性。本文提供可应对借鉴的思路,在一定程度上可以作为最佳实践。 目录 1、首先、了解项目项目背…

python趣味编程-5分钟实现一个俄罗斯方块游戏(含源码、步骤讲解)

Python俄罗斯方块游戏是一款基于GUI的标题匹配益智游戏,非常容易理解和使用。说到游戏玩法,一切都和真实的一样。 用户必须管理俄罗斯方块的随机序列。在这个Python 俄罗斯方块游戏项目中,我将教您如何使用 Python 制作俄罗斯方块游戏。 Python 代码中的俄罗斯方块游戏:项目…

Redux-状态管理组件

一、简介 react中的状态只属于某个组件。而Redux是一个全局管理js状态的架构,让组件通信更加容易。 之前是状态在所有组件间传递,而redux通过store来实现这个功能。 Redux特性: 1.Single source Of truth,通过store唯一维护状态…

nn.KLDivLoss,nn.CrossEntropyLoss,nn.MSELoss,Focal_Loss

KL loss:https://blog.csdn.net/qq_50001789/article/details/128974654 https://pytorch.org/docs/stable/nn.html 1. nn.L1Loss 1.1 公式 L1Loss: 计算预测 x和 目标y之间的平均绝对值误差MAE, 即L1损失: l o s s 1 n ∑ i 1 , . . . n ∣ x i…

SpringCloud 微服务全栈体系(十四)

第十一章 分布式搜索引擎 elasticsearch 四、RestAPI ES 官方提供了各种不同语言的客户端,用来操作 ES。这些客户端的本质就是组装 DSL 语句,通过 http 请求发送给 ES。官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/…

Amazon EC2的出现,是时代的选择了它,还是它选择了时代

目录 Amazon EC2简介 友商云服务器对比(Amazon VS Tencent) 友商云服务器对比(Amazon VS Alibaba) Amazon 云服务器的绝对优势 Amazon EC2功能 Amazon EC2 Linux 实例入门 启动实例 连接到的实例 清除的实例 终止的实例…

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

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

源码分析Mybatis拦截器(Interceptor)拦截saveBatch()获取不到实体id的原因

1.背景 由于业务需求想在Mybatis拦截器层面获取insert后实体id去做相关业务。但是发现执行saveBatch()方法时,获取参数实体的时候,拿不到自增id。但是save()方法可以。 save方法之所以可以是因为: MybatisPlus的BaseMapper执行insert方法后…

如何在虚拟机的Ubuntu22.04中设置静态IP地址

为了让Linux系统的IP地址在重新启动电脑之后IP地址不进行变更,所以将其IP地址设置为静态IP地址。 查看虚拟机中虚拟网络编辑器获取当前的子网IP端 修改文件/etc/netplan/00-installer-config.yaml文件,打开你会看到以下内容 # This is the network conf…

java拼图小游戏

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下: package heima;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import jav…

深入理解注意力机制(下)——缩放点积注意力及示例

一、介绍 在这篇文章中,我们将重点介绍 Transformer 背后的 Scaled Dot-Product Attention,并详细解释其计算逻辑和设计原理。 在文章的最后,我们还会提供一个Attention的使用示例,希望读者看完后能够对Attention有更全面的了解。…

将word中的表格无变形的弄进excel中

在上篇文章中记录了将excel表拷贝到word中来: 记录将excel表无变形的弄进word里面来-CSDN博客 本篇记录:将word中的表格无变形的弄进excel中。 1.按F12,“另存为...”,保存类型:“单个文件页面”,保存。…

Java读写Jar

Java提供了读写jar的类库Java.util.jar,Java获取解析jar包的工具类如下: import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import java.util.HashMap; import …

【C++入门到精通】新的类功能 | 可变参数模板 C++11 [ C++入门 ]

阅读导航 引言一、新的类功能1. 默认成员函数2. 类成员变量初始化3. 强制生成默认函数的关键字default4. 禁止生成默认函数的关键字delete5. override 和 final(1)override(2)final 二、可变参数模板递归函数方式展开参数包逗号表…

C# Winform围棋棋盘

C# Winform简单的围棋棋盘vs2008winform小游戏C#vs2010winform棋盘C#窗体小游戏 这是一个简单的围棋棋盘小游戏,使用C# Winform编写棋盘界面,玩家可以在空白的交叉点上下棋子 项目获取: 项目获取:typora: typora/img (gitee.co…

支付宝沙箱支付

支付宝沙箱支付 支付宝沙箱(Alipay Sandbox)是支付宝提供的一个模拟环境,用于开发者在不影响真实交易的情况下进行支付宝相关功能的测试和调试。在软件开发中,沙箱环境通常指的是一个隔离的测试环境,可以模拟真实环境…

【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…

Python 自动化(十八)admin后台管理

admin后台管理 什么是admin后台管理 django提供了比较完善的后台数据库的接口,可供开发过程中调用和测试使用 django会搜集所有已注册的模型类,为这些模型类提供数据管理界面,供开发使用 admin配置步骤 创建后台管理账号 该账号为管理后…

2023年中职“网络安全“—Web 渗透测试①

2023年中职"网络安全"—Web 渗透测试① Web 渗透测试任务环境说明:1.访问地址http://靶机IP/task1,分析页面内容,获取flag值,Flag格式为flag{xxx};2.访问地址http://靶机IP/task2,访问登录页面。…