【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

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

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

相关文章

【gogogo专栏】指针

go语言指针 为什么需要指针指针使用实例值传递地址传递多级指针 为什么需要指针 作为一个大学划水&#xff0c;毕业一直写java的程序员来说&#xff0c;多多少少对于指针有点陌生&#xff0c;由于近期需要转go&#xff0c;正好学到指针这里&#xff0c;就来探究下指针的使用场景…

ThreadLocal详解

ThreadLocal详解 一、故事背景二、知识点主要构成1、什么是ThreadLocal&#xff1f;2、ThreadLocal的基本使用内存泄漏问题引用类型&#xff1a;强引用&#xff1a;软引用弱引用虚引用 ThreadLocal内存泄漏原因 三、总结提升 一、故事背景 最近在学习并发编程相关内容&#xf…

Es、kibana安装教程-ES(二)

上篇文章介绍了ES负责数据存储&#xff0c;计算和搜索&#xff0c;他与传统数据库不同&#xff0c;是基于倒排索引来解决问题的。Kibana是es可视化工具。 分布式搜索ElasticSearch-ES&#xff08;一&#xff09; 一、ElasticSearch安装 官网下载地址&#xff1a;https://www…

[C语言] 指针

1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 目录 1. 指针是什么&#xff1f; 2. 指针和指针类型 2.1 指针-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4. 指针运算 4.1 指针…

不用技术代码,分班查询系统怎么做?

暑假即将结束&#xff0c;新学期开始将面临分班信息公布的工作&#xff01;对于分班信息公布&#xff0c;涉及到学生的个人信息&#xff0c;包括姓名、学号、班级等。在发布这些信息时&#xff0c;必须确保数据的保密性&#xff0c;防止未经授权的人员获取到学生的个人信息。因…

docker的服务/容器缺少vim问题

背景/问题&#xff1a; docker的服务/容器缺少vim问题 bash: vim: command not found 在docker的mysql服务中安装Vim 1、执行apt-get update root6d8d17e320a0:/# apt-get update问题:文件下载失败 Err:1 http://security.debian.org/debian-security buster/updates InRe…

【Linux】程序地址空间

程序地址空间 首先引入地址空间的作用什么是地址空间为什么要有地址空间 首先引入地址空间的作用 1 #include <stdio.h>2 #include <unistd.h>3 #include <stdlib.h>4 int g_val 100;6 int main()7 {8 pid_t id fork();9 if(id 0)10 {11 int cn…

自动方向识别式 LSF型电平转换芯片

大家好&#xff0c;这里是大话硬件。 今天这篇文章想分享一下电平转换芯片相关的内容。 其实在之前的文章分享过一篇关于电平转换芯片的相关内容&#xff0c;具体可以看链接《高速电路逻辑电平转换设计》。当时这篇文章也是分析的电平转换芯片&#xff0c;不过那时候更多的是…

JMeter 的并发设置教程

JMeter 是一个功能强大的性能测试工具&#xff0c;可以模拟许多用户同时访问应用程序的情况。在使用 JMeter 进行性能测试时&#xff0c;设置并发是非常重要的。本文将介绍如何在 JMeter 中设置并发和查看报告。 设置并发 并发是在线程组下的线程属性中设置的。 线程数&#…

3.解构赋值

解构赋值是一种快速为变量赋值的简洁语法&#xff0c;本质上仍然是为变量赋值。 3.1数组解构 数组解构是 将数组的单元值快速批量赋值给一系列变量 的简洁语法 1.基本语法: &#xff08;1&#xff09;赋值运算符左侧的[ ]用于批量声明变量&#xff0c;右侧数组的单元值将被赋…

前后端分离------后端创建笔记(04)前后端对接

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

【JavaEE进阶】Bean 作用域和生命周期

文章目录 一. 关于Bean作用域的实例1. lombok2. 实例代码 二. 作用域定义1. Bean的六种作用域2. 设置作用域 三. Spring 执行流程和 Bean 的生命周期1. Spring 执行流程2. Bean生命周期 一. 关于Bean作用域的实例 注意在此例子中需要用到lombok 1. lombok lombok是什么? Lo…

vue学习笔记

1.官网 v2官网 https://v2.cn.vuejs.org/ v3官网 https://cn.vuejs.org/ 2.vue引入 在线引入 <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> 下载引入(下载链接) https://v2.cn.vuejs.org/js/vue.js 3.初始化渲…

Redis——通用命令介绍

Redis官方文档 redis官方文档 核心命令 set 将key和value存储到Redis中&#xff0c;key和value都是字符串 set key valueRedis中不区分大小写&#xff0c;字符串类型也不需要添加单引号或者双引号 get 根据key读取value&#xff0c;如果当前key不存在&#xff0c;则返回…

Offset Explorer

Offset Explorer 简介下载安装 简介 Offset Explorer&#xff08;以前称为Kafka Tool&#xff09;是一个用于管理和使Apache Kafka 集群的GUI应用程序。它提供了一个直观的UI&#xff0c;允许人们快速查看Kafka集群中的对象以及存储在集群主题中的消息。它包含面向开发人员和管…

若依-plus-vue启动显示Redis连接错误

用的Redis是windows版本&#xff0c;6.2.6 报错的主要信息如下&#xff1a; Failed to instantiate [org.redisson.api.RedissonClient]: Factory method redisson threw exception; nested exception is org.redisson.client.RedisConnectionException: Unable to connect t…

springboot工程使用阿里云OSS传输文件

在application.yml文件中引入对应的配置&#xff0c;一个是对应的节点&#xff0c;两个是密钥和账号&#xff0c;还有一个是对应文件的名称&#xff1b; 采用这样方式进行解耦&#xff0c;便于后期修改。 然后需要设置一个properties类&#xff0c;去读对应的配置信息 用到了…

为什么需要知识图谱,如何构建它?

从关系数据库迁移到图形数据库的指南 跟随 发表于 迈向数据科学 7 分钟阅读 4天前 154 4 一、说明 TLDR&#xff1a;知识图谱在图数据库中组织事件、人员、资源和文档&#xff0c;以进行高级分析。本文将解释知识图谱的用途&#xff0c;并向您展示如何将关系数据模型转换为图…

在Java中对XML的简单应用

XML 数据传输格式1 XML 概述1.1 什么是 XML1.2 XML 与 HTML 的主要差异1.3 XML 不是对 HTML 的替代 2 XML 语法2.1 基本语法2.2 快速入门2.3 组成部分2.3.1 文档声明格式属性 2.3.2 指令&#xff08;了解&#xff09;&#xff1a;结合CSS2.3.3 元素2.3.4 属性**XML 元素 vs. 属…

windows程序基础

一、windows程序基础 1. Windows程序的特点 1&#xff09;用户界面统一、友好 2&#xff09;支持多任务:允许用户同时运行多个应用程序(窗口) 3&#xff09;独立于设备的图形操作 使用图形设备接口( GDI, Graphics Device Interface )屏蔽了不同硬件设备的差异&#…