JavaEE >> Spring Boot 日志

日志的作用以及什么是日志

日志就是为了当程序出错的时候,程序员们可以通过日志看到是哪部分出现错误了,为了发现和定位问题。当然,我们还可以通过日志实现一些功能,如下:

  • 记录系统的操作⽇志,⽅便数据恢复和定位操作⼈;
  • 记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持;
  • 记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户等。

在 Spring Boot 中,内置了日志框架(Slf4j),即让程序运行时可以通过控制台输出日志:
在这里插入图片描述
既然 Spring Boot 内置了日志框架,那么就可以通过框架来实现自定义日志的打印。

补充:
日志框架分为:日志门面、日志实现

  1. 日志门面框架:commons-logging、SLF4J. 这是日志的入口,是抽象层,不是具体的实现
  2. 日志实现框架:log4j、log4j2、JUL、logback. 这是日志的具体实现

在项目中,通常使用 日志门面 + 日志实现 实现日志。

自定义日志打印

分为两步:

  1. 在程序中得到日志对象;
  2. 使用日志对象打印日志。

代码实现:

@RestController
@RequestMapping("/log")
public class UserController {
    // 1. 得到日志对象
    private static final Logger logger = LoggerFactory.getLogger(UserController.class); // 通常为该类的类对象

    @RequestMapping("/getLog")
    public String printLog(){
        System.out.println("不使用日志对象打印日志");
        // 2. 通过日志对象打印日志
        logger.info("<<< 使用日志对象打印日志>>>");
        return "success";
    }
}

在引入 Logger 接口和 LoggerFactory 类的时候需要注意引入 slf4j 这个包:

在这里插入图片描述

得到的输出结果如下:
在这里插入图片描述

日志是一长串的,它们分别都有不同的意思,格式如下:
在这里插入图片描述

其中,日志级别也是可以自己设定打印级别的,比如一些日志不太重要,当为默认日志级别(INFO)的话,在控制台中就会输出很多日志,当我们排查的时候就会产生干扰,此时可以通过设置不同的日志级别来提高我们维护以及判断正误的效率。下面将介绍都有哪些日志级别,以及如何使用。

日志级别

日志级别分为六种(从低到高):

  1. trace:微量,少许的意思,追踪信息,级别最低;
  2. debug:需要调试时候的关键信息打印;
  3. info:普通的打印信息(默认⽇志级别);
  4. warn:警告,不影响使⽤,但需要注意一些问题;
  5. error:错误信息,级别较⾼的错误⽇志信息,一般不影响系统继续运行;
  6. fatal:致命的,因为代码异常导致程序退出执⾏的事件,需要立即被处理的系统级错误。

Spring Boot 默认的日志级别就是 INFO 级别,即在控制台只会报告 info、warn、error、fatal 这几种级别的日志。

设置日志级别

1. 通过配置文件进行设置(yml、properties)

logging.level.root =error  // properties 配置文件设置日志级别.  此处设置一个 error 级别的日志    

当项目启动时,就只会出现 error 和 fatal 级别的日志(此处由于项目启动是正常的,就不会出现该日志):
在这里插入图片描述
yml 配置项:

logging:
  level:
    root: debug

就会发现输出了 debug 及以上级别的日志:
在这里插入图片描述

2. 通过日志框架进行设置

@RestController
@RequestMapping("/log")
public class UserController {
    // 1. 得到日志对象
    private static final Logger logger = LoggerFactory.getLogger(UserController.class); // 通常为该类的类对象

    @RequestMapping("/getLog2")
    public  String printLog2(){
    // 2. 通过日志对象打印日志
        logger.debug("<<< debug 级别日志>>>");
        logger.error("<<< error 级别的日志>>>");
        logger.trace("<<< trace 级别的日志>>>");
        logger.warn("<<< warn 级别的日志>>>");
        logger.info("<<< info 级别的日志>>>");
        return "success";
    }
}

运行结果如下:
在这里插入图片描述
此时就会发现只出现了三种级别的日志,info、warn、error,没有出现 trance、debug,这就是 Spring Boot 的默认日志级别捣鬼,当我们没有设置默认日志级别时项目是 info 级别的,而 info 级别的日志不会输出 trance、debug 级别的日志,这也就说明了控制台为什么只输出上述三种级别的日志了。
接下来当我们通过配置文件设置项目默认日志级别为 debug,再次运行项目就会发现:

在这里插入图片描述

小结:当我们需要输出低级别的日志时(相比于 info),需要先在配置项里面配置默认日志输出级别,然后通过日志框架自定义日志级别才能完整的输出。

日志持久化

我们在项目中日志的输出都是在控制台上面的,而控制台伴随着项目重启就清除了,日志就没有了。在这里 Spring Boot 提供了可以让日志保存在硬盘里面的方法。

通过配置配置文件(yml、properties)

在项目中,可以通过在 yml 或者 properties 中配置持久化路径来保存日志:

# 日志的配置
logging:
  level:
    root: info  # root 表示根目录,即整个项目的日志级别
  file:
    path: logger/  # 配置日志路径
    

在这里插入图片描述
也可以通过 name 属性来配置文件路径(绝对路径和相对路径都可)以及文件名称:

  1. 不设置路径,只设置名称:
# 日志的配置
logging:
  level:
    root: info  # root 表示根目录,即整个项目的日志级别
  file:
    path: logger/  # 配置日志路径
    name: test.log # 配置日志名称

在这里插入图片描述
就会保存在项目的根目录。

注意:
在这里插入图片描述

  1. 设置路径和名称:
# 日志的配置
logging:
  level:
    root: info  # root 表示根目录,即整个项目的日志级别
  file:
    #path: logger/  # 配置日志路径
    name: logger111/test.log # 配置日志路径及名称. 此处也可以设置绝对路径

在这里插入图片描述

日志文件分割

在配置文件里面进行配置(yml),如下:

# 日志的配置
logging:
  level:
    root: info  # root 表示根目录,即整个项目的日志级别
  file:
    path: logger/  # 配置日志路径
    name: logger111/test.log # 配置日志路径及名称
  logback:   # 设置日志分割
    rollingpolicy:
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i  # 分割的格式
      max-file-size: 3KB  # 满足多大进行分割

在这里插入图片描述
当运行项目的时候,日志文件大小达到 3 KB 的时候就会自动将日志文件进行分割,分割出来的日志文件会根据你在项目中设置的分割格式进行命名。

此处的 3 KB 不一定为 3 KB ,因为它是按一条一条的日志进行分割的,总不能因为分割半条日志而文件大小到了就不分割了,会保证日志的完整性。
此处只是简单介绍日志文件相关配置项,更多可以查看 Spring 官网。

在这里插入图片描述

更简单的日志输出(lombok @Slf4j)

上述对于日志的输出都需要两步(一是得到日志对象,二是根据日志对象进行输出),这样输出日志的时候,在每个类中都要先获取到该类的日志对象,就比较麻烦,而在引用 lombok 中的 @Slf4j 注解后,就不需要获取每个类的日志对象了。

首先需要现在 pom.xml 中引入 lombok 的依赖:

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>

然后通过注解输出日志即可,代码如下:
其中引入注解的时候需要引入 lombok 中的 @Slf4j 注解:
在这里插入图片描述

@Slf4j
@RestController
@RequestMapping("/log2")
public class UserController2 {
    @RequestMapping("/getLog")
    public  String printLog(){
        log.debug("<<< debug 级别日志>>>");
        log.error("<<< error 级别的日志>>>");
        log.trace("<<< trace 级别的日志>>>");
        log.warn("<<< warn 级别的日志>>>");
        log.info("<<< info 级别的日志>>>");
        return "success";
    }
}

启动项目,运行就可以将日志的输出了:
在这里插入图片描述

lombok 实现日志输出原理解释:
Java 程序在运行的时候首先是将用户写的代码(即 .Java 文件),编码成字节码文件(即 .class 文件),然后再通过 JVM 进行加载和运行。而 @Slf4j 这个注释就是在将 .Java 文件编码成 .class 文件后,生成了上述得到日志对象这样的代码,如下:

在这里插入图片描述
其实实际上还是通过两步来输出日志的(得到日志对象,通过日志对象进行输出)。
其中 .class 文件都会在 target 目录中:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS探索之旅:定位

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文我们详细介绍 css中定位的相关知识点 定位的用处 先简单认识一下定位是做什么的。 其实&#xff0c;定位的功能就像他的名字一样&#xff0c;可以规定显示在网页的一个位置。 其他布局的效果 我们之前默认…

Java面试——不安全的集合类

​ 系统性学习&#xff0c;移步IT-BLOG-CN Java 中有许多的集合&#xff0c;常用的有List&#xff0c;Set&#xff0c;Queue&#xff0c;Map。 其中 List&#xff0c;Set&#xff0c;Queue都是Collection&#xff08;集合&#xff09;&#xff0c;List中<>的内容表示其中…

基于Pytorch深度学习——卷积神经网络(卷积层/池化层/多输入多输出通道/填充和步幅/)

本文章来源于对李沐动手深度学习代码以及原理的理解&#xff0c;并且由于李沐老师的代码能力很强&#xff0c;以及视频中讲解代码的部分较少&#xff0c;所以这里将代码进行尽量逐行详细解释 并且由于pytorch的语法有些小伙伴可能并不熟悉&#xff0c;所以我们会采用逐行解释小…

Java 笔记 15:Java 数组相关内容补充,多维数组,Arrays 类的常见用法,以及冒泡排序

一、前言 记录时间 [2024-05-05] 系列文章简摘&#xff1a; Java 笔记 01&#xff1a;Java 概述&#xff0c;MarkDown 常用语法整理 Java 笔记 02&#xff1a;Java 开发环境的搭建&#xff0c;IDEA / Notepad / JDK 安装及环境配置&#xff0c;编写第一个 Java 程序 Java 笔记 …

【在线OJ】Vue在线OJ项目

一、主页 二、题库 三、在线编译器 四、比赛 五、搜索 六、个人主页

【区块链】比特币架构

比特币架构 2009年1月&#xff0c;在比特币系统论文发表两个月之后&#xff0c;比特币系统正式运行并开放了源码&#xff0c;标志着比特币网络的正式诞生。通过其构建的一个公开透明、去中心化、防篡改的账本系统&#xff0c;比特币开展了一场规模空前的加密数字货币体验。在区…

vue3(实现上下无限来往滚动)

一、问题描述 一般在大屏项目中&#xff0c;很常见的效果&#xff0c;就是容器中的内容缓慢地向下移动&#xff0c;直到底部停止&#xff0c;然后快速滚动回顶部&#xff0c;然后接着缓慢滚动到底部。并且在特定的情况下&#xff0c;还需要进行一些小交互&#xff0c;那就还得让…

RabbitMQ之生产批量发送

为什么要用生产批量发送&#xff1f; 批量发送消息&#xff0c;可以提高MQ发送性能。但是 RabbitMQ 并没有提供了批量发送消息的 API 接口,使用 spring-amqp 的 BatchingRabbitTemplate 实现批量能力。 SimpleBatchingStrategy 发送策略满足以下规则会进行发送&#xff1a; ba…

FreeRTOS低功耗模式(1-19)

低功耗模式简介(了解) 很多应用场合对于功耗的要求很严格&#xff0c;比如可穿戴低功耗产品、物联网低功耗产品等 一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。 FreeRTOS也提供了一个叫Tickless的低功耗模式,方便带FreeRTOS操作系统的应用开发 stm32的低…

C#创建obj三维模型文件

介绍 使用开源库创建obj三维模型文件。 开源库地址&#xff1a;https://github.com/JeremyAnsel/JeremyAnsel.Media.WavefrontObj 相关API地址&#xff1a;https://jeremyansel.github.io/JeremyAnsel.Media.WavefrontObj/api/JeremyAnsel.Media.WavefrontObj.ObjFile.html …

docker desktop实战部署oracle篇

1、前言 oracle数据库官方已提供现成的镜像&#xff0c;可以直接拿来部署了。 由于项目中需要使用oracle数据库的分表功能&#xff0c;之前安装的是standard版本&#xff0c;无奈只能重新安装。网上查了一番&#xff0c;使用的方法都比较传统老旧&#xff1a;下载安装包手动安…

多线程局部存储技术

问题 多线程上下文中&#xff0c;每个线程需要使用一个专属的全局变量&#xff0c;该如何实现&#xff1f; 代码示例 一种可能的解决方案 test1.c #define _GNU_SOURCE /* To get pthread_getattr_np() declaration */ #define _XOPEN_SOURCE > 500 || _POSIX_C_SOURC…

谷歌上架,为什么会触发填表单,可以避免吗?怎么填表单可以提高通过率?

在谷歌上架过程中&#xff0c;相信大部分开发者都有收到过谷歌发来表单填写的邮件通知&#xff0c;要求开发者们在14天内根据表单要求回复关于应用部分情况。邮件如图&#xff1a; 根据触发填表单的开发者分享的经验来看&#xff0c;填完表之后出现的情况不尽相同&#xff0c;且…

【华为】路由综合实验(OSPF+BGP基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP&#xff0c;使AR4和AR3成为eBGP&#xff0c;AR4和AR5成为iBGP对等体…

【JVM】class文件格式,JVM加载class文件流程,JVM运行时内存区域,对象分配内存流程

这篇文章本来只是想讲一下class文件格式&#xff0c;讲着讲着越讲越多。JVM这一块吧&#xff0c;知识比较散比较多&#xff0c;如果深研究下去如死扣《深入理解Java虚拟机》&#xff0c;这本书很深很细&#xff0c;全记住是不可能的&#xff0c;其实也没必要。趁这个机会直接把…

RK3568平台(基础篇)linux错误码

一.概述 linux应用程序开发过程中&#xff0c;经常会遇到一些错误信息的返回&#xff0c;存在的可能性有&#xff0c;参数有误、非法访问、系统资源限制、设备/文件不存在、访问权限限制等等。对于这类错误&#xff0c;可以通过perror函数输出具体描述&#xff0c;或者通过str…

nacos-server-1.2.1启动

1、双击startup.cmd 2、启动日志 3、访问http://192.168.26.210:8848/nacos/index.html 4、登录 用户名&#xff1a;nacos 密码&#xff1a;nacos

掌握JavaScript面向对象编程核心密码:深入解析JavaScript面向对象机制对象概念、原型模式与继承策略全面指南,高效创建高质量、可维护代码

ECMAScript&#xff08;简称ES&#xff0c;是JavaScript的标准规范&#xff09;支持面向对象编程&#xff0c;通过构造函数模拟类&#xff0c;原型链实现继承&#xff0c;以及ES6引入的class语法糖简化面向对象开发。对象可通过构造函数创建&#xff0c;使用原型链共享方法和属…

【云原生】Docker 的网络通信

Docker 的网络通信 1.Docker 容器网络通信的基本原理1.1 查看 Docker 容器网络1.2 宿主机与 Docker 容器建立网络通信的过程 2.使用命令查看 Docker 的网络配置信息3.Docker 的 4 种网络通信模式3.1 bridge 模式3.2 host 模式3.3 container 模式3.4 none 模式 4.容器间的通信4.…

小白如何搭建git

1、安装git 在Windows上安装git&#xff1a; 关注微信公众号“机器人学”回复 “搭建git” 利用百度云网盘下载安装包&#xff0c;建议下载如下版本的否则可能会出现错误。 安装完成后&#xff0c;在开始菜单里Git->git bash&#xff0c;弹出命令窗说明git安装成功。 鼠标右…