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

【JavaEE进阶】SpringBoot 日志

文章目录

  • 一. 日志有什么用?
  • 二. 自定义日志打印
    • 1. 日志的使用与打印
  • 三. 日志级别
    • 1. 日志级别有什么用?
    • 2. 日志级别的分类及使用
  • 四. 日志持久化
  • 五. 更简单的日志输出---Lombok
    • 1. Lombok的使用
    • 2. lombok原理解释
      • 2.1 Lombok更多注解说明

一. 日志有什么用?

在Java中,日志是一种记录和追踪应用程序运行时信息的重要工具.以下是日志在Java中的几个主要用途:

  1. 调试和故障排查:通过输出详细的日志消息,可以帮助开发人员调试代码并解决问题。日志可以记录关键的变量值、函数调用堆栈等信息,从而更好地定位和修复 bug。
  2. 运行时监控:日志可以用于监控应用程序的运行情况,例如记录关键指标(如请求处理时间、数据库查询次数)以及异常情况。这些信息可以用来分析应用程序性能、发现潜在的瓶颈或异常行为,并进行相应的优化和调整。
  3. 安全审计和合规性:日志记录可以用于安全审计和合规性检查。通过记录关键事件和操作,可以提供追踪和审计的能力,了解系统的用户行为、权限变更等情况,以便跟踪不当行为或满足法规要求。
  4. 性能分析:通过分析应用程序的日志,可以评估其性能,并找出潜在的性能问题和瓶颈。通过记录请求响应时间、资源使用情况等数据,可以对应用程序的性能进行实时监测和优化。
  5. 记录用户登录日志,方便分析用户是正常登录还是恶意破解⽤户。记录系统的操作日志,方便数据恢复和定位操作⼈。记录程序的执行时间,方便为以后优化程序提供数据支持.

Java中有多种日志框架可供选择,如Log4jLogbackjava.util.logging等。这些日志框架提供了丰富的功能和配置选项,可以根据需求灵活地记录日志,并支持将日志输出到不同的目标(如控制台、文件、数据库等)。

Spring Boot中,可以通过使用日志框架来记录应用程序的日志。Spring Boot默认使用的是SLF4J(Simple Logging Facade for Java),并且集成了常用的日志实现框架,如LogbackLog4j2
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二. 自定义日志打印

程序员自定义打印日志的实现步骤:

  1. 在程序中得到日志对象.
  2. 使用日志对象的相关语法输出要打印的内容

1. 日志的使用与打印

  1. pom.xml中添加以下依赖:
		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency>
  1. 配置日志级别:在application.propertiesapplication.yml中配置日志级别。可以设置根级别日志以及特定类或包的日志级别。例如,要将根级别日志设置为info级别,可以在配置文件中添加以下配置:在这里插入图片描述
  2. 记录日志:在代码中使用日志打印语句记录日志。Spring Boot通过@Autowired注解将日志对象注入到代码中,可以直接使用。例如,在一个Controller类中,可以这样使用日志:
package com.example.demo;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 MyController {private static final Logger logger = LoggerFactory.getLogger(MyController.class);//步骤一@RequestMapping("/hello")public String home() {logger.info("Hello, info!");//步骤二return "Welcome to my application!";}
}

注意此处导入的包是import org.slf4j.Logger;关于Logger的包有很多,注意不要导错了.
在这里插入图片描述

在网页中访问:http://localhost:8888/hello
结果如下:
在这里插入图片描述
同时再控制台中我们可以看到以下日志信息:
在这里插入图片描述
注意:Spring Boot还提供了一些特殊的日志记录器,如logging.filelogging.path等,用于指定日志文件的位置和名称。此外,还可以使用logging.pattern.consolelogging.pattern.file等属性来自定义控制台和文件日志的输出格式。

下来我们试一下不同日志级别的打印以及日志各部分详情介绍:
在这里插入图片描述
那么就有小伙伴疑惑,为什么`logger.trace(“Hello, trace!”); logger.debug(“Hello,debug!”);``这两行没有打印呢?这与日志的级别有关:

三. 日志级别

1. 日志级别有什么用?

日志级别用于控制日志输出的详细程度,可以根据需求选择合适的级别来记录和查看日志信息。通过设置适当的日志级别,可以灵活地控制日志的输出量和详细程度。在开发和调试阶段可以使用较低的日志级别(如DEBUG),以获得更多的信息帮助排查问题。而在生产环境中,可以将日志级别设置为较高的级别(如INFO或WARN),以减少日志输出并降低对性能的影响。
此外,日志级别还可以根据具体的应用程序需求进行扩展和自定义。例如,可以定义自己的日志级别来表示特定的业务场景或关键事件。

2. 日志级别的分类及使用

⽇志的级别分为:

  1. TRACE(追踪):最详细的日志级别,通常用于跟踪代码执行路径、变量状态等详细信息。在生产环境中很少使用,因为它会产生大量的日志输出。

  2. DEBUG(调试):用于开发和调试阶段,输出较为详细的日志信息,有助于理解代码的执行过程和检测问题。在生产环境中一般不建议使用,因为它会产生大量的日志输出。

  3. INFO(信息):用于输出重要的业务信息,如应用程序启动信息、关键操作完成信息等。通常会记录应用程序运行中的重要事件,可以用于监控和分析。

  4. WARN(警告):表示潜在的错误情况,可能会导致应用程序出现异常或不正常的行为,但不会造成严重的系统故障。例如,某些配置项未设置、数据库连接超时等。需要引起注意,但不会影响应用程序的正常运行。

  5. ERROR(错误):表示发生了可恢复的错误,导致应用程序无法正常执行某些功能或服务。例如,数据库连接失败、请求处理异常等。需要开发人员关注并及时处理。

  6. FATAL(致命):表示发生了无法恢复的严重错误,这通常会导致应用程序崩溃或无法继续执行。例如,关键依赖项启动失败、文件系统不可用等。

在这里插入图片描述
级别越高,接收到的消息就越少,如设置了 warn 就只能收到 warn、error、fatal 级别的日志了。
日志级别配置只需要在配置文件中设置“logging.level”配置项即可,如下所示:
在这里插入图片描述

此时就只打印error级别及以上的日志了:
在这里插入图片描述
默认日志输出级别
清除掉配置⽂件中的日志设置,观察控制台输⼊的日志级别。
得到以下结论,日志的输出级别,默认是 info

四. 日志持久化

上述日志都是输出在控制台上的,然而在生产环境上我们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化.以下是在Spring Boot中进行日志持久化的步骤:

  1. 添加依赖:在项目的pom.xml文件中添加日志框架的依赖。可以通过Spring Boot Starter依赖简化配置的过程,例如对于Logback,可以添加spring-boot-starter-logging依赖。
		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency>
  1. 配置文件:在application.propertiesapplication.yml中进行相应的配置。具体配置方式取决于所选择的日志框架。
logging:file:
#    设置日志文件的目录path: E:\\JavaEE\\logger
#    设置日志文件的名字name: E:\\JavaEE\\logger\\SpringBootDemoLog.log

我们可以在E:\\JavaEE\\logger目录中看到以下文件:
在这里插入图片描述
可以看到文件中记录了当前运行的日志信息:
在这里插入图片描述

五. 更简单的日志输出—Lombok

每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦,这里讲⼀
种更好⽤的日志输出方式,使用 lombok 来更简单的输出。

  1. 添加 lombok 框架⽀持。
  2. 使⽤ @slf4j 注解输出⽇志。

1. Lombok的使用

添加Lombok依赖:

		<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
package com.example.demo;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/p")
@Slf4j
public class PersonController {@RequestMapping("/log")public void loggerTest() {log.error("------------------- error -----------------");}
}

运行结果:
在这里插入图片描述

2. lombok原理解释

lombok 能够打印⽇志的密码就在 target ⽬录⾥⾯,target 为项⽬最终执⾏的代码,查看 target ⽬录如下:

在这里插入图片描述
Java程序运行原理:
在这里插入图片描述
Lombok的作用如下图所示:
在这里插入图片描述
Lombok的运行原理是通过注解处理器在编译时对源代码进行解析和转换,生成对应的代码片段,并将其插入到编译过程中的抽象语法树中,从而简化Java类的编写。这样可以减少开发者编写重复、繁琐的代码,提高开发效率。

2.1 Lombok更多注解说明

基本注解:

注解作⽤
@Getter⾃动添加 getter ⽅法
@Setter⾃动添加 setter ⽅法
@ToString⾃动添加 toString ⽅法
@EqualsAndHashCode⾃动添加 equals 和 hashCode ⽅法
@NoArgsConstructor⾃动添加⽆参构造⽅法
@AllArgsConstructor⾃动添加全属性构造⽅法,顺序按照属性的定义顺序
@NonNull属性不能为 null
@RequiredArgsConstructor⾃动添加必需属性的构造⽅法,final + @NonNull 的属性为必需

组合注解:

注解作⽤
@Data@Getter + @Setter + @ToString +@EqualsAndHashCode +@RequiredArgsConstructor +@NoArgsConstructor
@Slf4j添加⼀个名为 log 的⽇志,使⽤ slf4j

相关文章:

【JavaEE进阶】SpringBoot 日志

文章目录 一. 日志有什么用?二. 自定义日志打印1. 日志的使用与打印 三. 日志级别1. 日志级别有什么用?2. 日志级别的分类及使用 四. 日志持久化五. 更简单的日志输出---Lombok1. Lombok的使用2. lombok原理解释2.1 Lombok更多注解说明 一. 日志有什么用? 在Java中&#xf…...

conda - 调研介绍

介绍: conda 是一个工具, 也是一个可执行命令, 其核心功能是管理包与环境. conda 支持多种语言, 用来管理Python包是绰绰有余的. 这里注意区分conda和pip, pip命令可以在任何环境中安装Python包, 而conda则是在conda环境中安装任何语言包. 接触过的conda主要有miniconda与anac…...

keepalived集群

keepalived概述 keepalived软件就是通过vrrp协议来实现高可用功能。 VRRP通信原理 VRRP就是虚拟路由冗余协议&#xff0c;它的出现就是为了解决静态路由的单点故障。 VRRP是通过一种竞选一种协议机制来将路由交个某台VRRP路由器。 VRRP 用IP多播的方式&#xff08;多播地…...

CentOS系统环境搭建(八)——CentOS7开机自动执行脚本(以MySQL为例)

CentOS7开机自动执行脚本 文章目录 CentOS7开机自动执行脚本第一步&#xff1a;新建一个脚本run.sh第二步&#xff1a;脚本添加可执行权限第三步&#xff1a;执行如下命令将/etc/rc.d/rc.local文标记为可执行文件第四步&#xff1a;打开/etc/rc.d/rc.local文件&#xff0c;在最…...

re学习(31)BUUCTF-xx(多层加密)

参考文章&#xff1a;【BUUCTF逆向 [2019红帽杯]xx】_nb_What_DG的博客-CSDN博客 re学习笔记&#xff08;26&#xff09;BUUCTF-re-[2019红帽杯]xx_Forgo7ten的博客-CSDN博客 还有B站 水番正文 IDA64位载入 shiftF12查看字符串 交叉引用找到关键代码 使用findcrypt插件找到…...

HDFS的小文件影响及解决办法

Hadoop Distributed File System (HDFS) 是用于存储和处理大规模数据的分布式文件系统。然而,HDFS 中的小文件可能会对系统性能和资源利用产生一些影响。下面是小文件对HDFS的影响以及处理方法的一些信息: 影响: 元数据开销: HDFS中的每个文件和目录都有相关的元数据(文件…...

【前端】husky 的使用

husky 是一个优化 git hooks 的 npm 库 Modern native Git hooks made easy 安装和使用 1.安装 npm install husky --save-dev 2. 初始化 npx husky install&#xff1b;官方文档的写法是在 package.json 中初始化&#xff0c;本质上还是执行了 npx husky install 指令 3. 添加…...

Spring系列篇 -- Bean的生命周期

目录 经典面试题目&#xff1a; 一&#xff0c;Bean的生命周期图 二&#xff0c;关于Bean的生命周期流程介绍&#xff1a; 三&#xff0c;Bean的单例与多例模式 总结&#xff1a; 前言&#xff1a;今天小编给大家带来的是关于Spring系列篇中的Bean的生命周期讲解。在了解B…...

分类预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元多输入分类预测

分类预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元多输入分类预测 目录 分类预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现BO-BiGRU贝叶斯优化双向门控循环单元多特征分…...

Linux权限系列--给普通用户添加某个命令的sudo权限

原文网址&#xff1a;Linux权限系列--给普通用户添加某个命令的sudo权限_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Linux系统如何给普通用户添加某个命令的sudo权限。 使用场景 普通开发者可能需要sudo的命令&#xff1a; apt-get&#xff08;经常要安装软件&#x…...

11-数据结构-栈和队列的应用(C语言)

栈和队列的应用 目录 栈和队列的应用 一、括号匹配&#xff08;栈&#xff09; 二、表达式的各种转换 (1)中缀转后缀(手工) (2)后缀转中缀表达式(手工) (3)中缀转后缀(栈) (4)中缀转后缀&#xff08;树&#xff09; (5)后缀表达式求值 (6)中缀表达式求值&#xff08;栈…...

uni-app自定义多环境配置,动态修改appid

背景 在企业级项目开发中&#xff0c;一般都会分为开发、测试、预发布、生产等多个环境&#xff0c;在工程化中使用不同的打包命令改变环境变量解决不同环境各种变量需要手动修改的问题&#xff0c;比如接口请求地址&#xff0c;不同环境的请求路径前缀都是不同的。在使用uni-…...

04 - 分离头指针情况、理解HEAD和branch

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. 分离头指针2. HEAD和branch2.1 branch的一些操作2.2 HEAD 1. 分离头指针 分离头指针detached HEAD是一种HEAD指针指向了某一个具体的 commit id&#xff0c;而不是分支的情况。 切换…...

C#__基本特性和使用

// 特性&#xff08;attribute&#xff09;: // 一种允许我们向程序集添加元数据的语言结构 // 用于保存程序结构信息的某种特殊类型的类 // 类似“批注”&#xff0c;用于解释说明 #define IsShowMessage // 宏定义&#xff0c;在开头定义&#xff0…...

mysql(3)

分库分表 分库&#xff1a;将数据库中的数据分散到不同数据库上&#xff0c;可以垂直分库和水平分库。 1.垂直分库&#xff1a;把单一的数据按照业务进行划分&#xff0c;不同的业务使用不同的数据库&#xff0c;进而将一个数据库的压力分散到多个数据库。 2.水平分库&#…...

阿里巴巴常用的12个后端开发工具

1 阿尔萨斯Java在线诊断工具 Arthas是一款用于Java应用程序的在线诊断工具&#xff0c;由阿里巴巴于2018年9月开源。 典型场景&#xff1a; 您不知道从中加载类的特定JAR包。 您想弄清楚为什么您的系统会抛出各种与类相关的异常。 您不知道为什么修改后的代码无法执行。您不…...

php base64转图片保存本地

调用函数 public function base64(){$img $this->request->param(img);$img data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAkACQAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy…...

unity物体移动至指定位置

物体坐标与物体移动 世界坐标与局部坐标之间的转换物体移动至指定位置需求思路注意 世界坐标与局部坐标之间的转换 在Unity中&#xff0c;物体的坐标分为局部坐标和世界坐标。 局部坐标是相对于物体的父对象的坐标系&#xff0c;而世界坐标是相对于场景的整体坐标系。 使用tr…...

详解C#-static void Main(string[] args)

目录 简介: 举例: 输出结果:​编辑 总结&#xff1a; 简介: 在C#中static void Main(string[] args)这个句话有什么作用&#xff0c;分别代表什么意思&#xff01;&#xff01; 这句话是入口函数的声明&#xff0c;指定了C#程序的入口点&#xff0c;并定义了一个名为”Mai…...

中大许少辉博士《乡村振兴战略下传统村落文化旅游设计》中国建筑工业出版社八一付梓。

中大许少辉博士《乡村振兴战略下传统村落文化旅游设计》中国建筑工业出版社八一付梓。...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...