SpringBoot 日志

目录

一. 日志概述

二. 日志的使用

1. 打印日志

(1) 获取日志对象

(2) 输出要打印的内容

2. 日志框架简介

(1) 门面模式简介

(2) SLF4J 框架简介

3. 日志的格式

4. 日志的级别

5. 日志配置

(1) 配置日志级别

(2) 日志持久化存储

① 配置日志文件名

② 配置日志的存储目录

(3) 日志文件分割

(4) 更简单的日志输出


一. 日志概述

日志对我们来说并不陌生, 从JavaSE部分开始, 我们就在使用 System.out.print 来打印日志了. 通过打印日志来发现和定位问题, 或者根据日志来分析程序的运行过程. 在Spring的学习中, 我们也经常根据控制台的日志来分析和定位问题.

随着项目的复杂度提升, 我们对日志的打印也有了更高的需求, 不仅仅是定位排查问题.

比如 记录一些用户的操作记录; 使用日志来记录用户的一些喜好; 把日志持久化, 后续进行数据分析等. 但是 System.out.print 不能很好的满足我们的需求, 此时我们就需要引入一些专门的日志框架来完成这样的任务.

二. 日志的使用

1. 打印日志

打印日志的步骤:

step1: 从程序中获取日志对象.

step2: 使用日志对象输出要打印的内容.

(1) 获取日志对象

在程序中获取日志对象需要使用日志工厂 LoggerFactory, 如下代码所示:

package com.jrj.logger;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LoggerController {public static Logger logger = LoggerFactory.getLogger(LoggerController.class);
}

[注意]:

① Logger 对象是属于 org.slf4j 包下的, 不要导错包. 

② LoggerFactory.getLogger 需要传递一个参数. 参数类型是一个类对象, 传入的是哪个类的类对象, 就表示哪个类在打印日志.

(2) 输出要打印的内容

日志对象的打印方法有很多种, 我们这里先使用 logger.info() 方法打印.

@RestController
public class LoggerController {public static Logger logger = LoggerFactory.getLogger(LoggerController.class);@RequestMapping("/printLogger")public static String printLogger(){logger.info("打印日志");return "打印日志";}
}

打印结果如下: 

2. 日志框架简介

SLF4J不同于其他日志框架. 它并不是一个真正的日志实现, 而是一个抽象层, 一种接口. 所有SLF4J并不能独立使用, 需要和具体的更底层的日志框架配合使用.

(1) 门面模式简介

门面模式又称为外观模式. 提供了一个统一的接口, 用来访问子系统中的一群接口. 其主要特征是 定义了一个高层接口, 让子系统更容易使用.

 

(2) SLF4J 框架简介

SLF4J 就是其他日志框架的门面. SLF4J可以理解为是提供日志服务的统一API接口, 并不涉及到具体的日志逻辑实现.

存在的问题:

  • 不同日志框架的API接口和配置文件不同. 如果多个日志框架共存, 那么不得不维护多套配置文件(这个配置文件是指用户自定义的配置文件).
  • 如果要更换日志框架, 应用程序将不得不修改代码, 并且修改过程中可能会存在⼀些代码冲突.
  • 如果引入的第三方框架, 使用了多套, 那就不得不维护多套配置.

 

3. 日志的格式

通过打印出的日志我们可以看到, 日志内容从左到右依次为:

① 日期, 时间 (精确到毫秒)

② 日志级别

③ 进程ID

④ 打印日志的项目名

⑤ 线程名

⑥ Logger 名

⑦ 日志内容

 

4. 日志的级别

日志级别代表着日志信息对应问题的严重性, 方便更快地筛选符合目标的日志信息.

日志的级别从高到低依次为: FATAL, ERROR, WARN, INFO, DEBUG, TRACE

  • FATAL: 致命信息, 表示需要立即被处理的系统级错误.
  • ERROR: 错误信息, 级别较高的错误日志信息,但仍然不影响系统的继续运行.
  • WARN: 警告信息, 不影响使用,但需要注意的问题
  • INFO: 普通信息, 用于记录应用程序正常运行时的⼀些信息,例如系统启动完成、请求处理完成等.
  • DEBUG: 调试信息, 需要调试时候的关键信息打印.
  • TRACE: 追踪信息, 比DEBUG更细粒度的信息事件 (除非有特殊用意,否则一般使用DEBUG级别替代)

[注]: 一般情况下, 日志级别越高, 收到的消息越少.

例如: 出现fatal级别的日志, 表示服务器出现了某种程度上的不可用, 需要程序员紧急介入处理, 一般在一个程序的生命周期中fatal级别的日志只会出现一次

我们下来打印一下不同级别的日志观察一下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/logger")
public class LoggerController {public static Logger logger = LoggerFactory.getLogger(LoggerController.class);@RequestMapping("/printLogger")public static String printLogger(){logger.info("打印info日志");logger.error("打印error日志");logger.warn("打印warn日志");logger.debug("打印debug日志");logger.trace("打印trace日志");return "打印日志";}
}

从打印结果我们可以看到: 只打印出了 INFO, WARN, ERROR 级别的日志. 却没有打印出 DEBUG 和 TRACE 级别的日志. 这是因为日志的输出默认最低级别是 INFO 级别, 也就是说, 级别低于INFO的都不会打印出来.

5. 日志配置

(1) 配置日志级别

日志的级别配置只需要在配置文件中设置 "logging.level" 配置项即可.

properties:

logging.level.root=debug

yml:

logging:level:root: debug

运行后效果: 

 

后续我们在项目中配置日志级别时, properties 和 yml 只需要配置其中的一个即可. 

root 表示的是该项目下的所有文件的日志. 我们也可以通过 在level下面加上软件包的树形结构 来限定 只有指定包下文件的日志从指定级别开始打印.

logging.level.org.example.practice.LoggerController=trace

 

(2) 日志持久化存储

以上的日志都是输出在控制台的 (日志存在内存中), 但是我们有时需要持久存储日志 (将日志存到硬盘中) 以便出现问题之后追溯问题. 那如何持久化存储日志呢? --> 日志的持久化存储有两种方式

① 配置日志文件名
# 设置⽇志⽂件的⽂件名
logging:file:name: logger/springboot.log

 

② 配置日志的存储目录
# 设置⽇志⽂件的⽬录
logging:file:path: F:/temp

配置好后, 运行程序, 会发现指定路径下多出一个文件.

  • 配置日志文件的存储路径, 可以是相对路径, 可以是绝对路径. 路径中只可以设置路径(不能设置文件名称).
  • logging.file.name 和 logging.file.path 两者都配置的情况下, 只生效一个 (以 logging.file.name 为准)

(3) 日志文件分割

如果我们的日志都放在一个文件中, 随着项目的运行, 日志文件就会越来越大. 此时我们就需要对日志文件进行分割.

当然日志框架也考虑到了这一点. 所以我们如果不手动分割的话, 就会自动进行分割 (默认日志文件大小超过10M就进行分割).

logging:logback:rollingpolicy:max-file-size: 2KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i

上述代码中的配置表示: ① 最大日志文件大小为2KB (大小超过2KB就分割) ; ② 分割后的日志文件名为: 日志名. 日期. 索引 

将上述代码运行, 并且多打印几次日志, 我们得到:

(4) 更简单的日志输出

每次都使用LoggerFactory很繁琐,每个类都要添加一遍Logger对象,于是lombok就为我们提供了一种特别方便的方式.

  1. 添加lombok依赖.
  2. 使用 @Slf4j注解.

@Slf4j 注解产生Logger对象(对象名默认为log). 使用log对象进行日志输出. 

@RestController
@Slf4j
public class LoggerController {public static String printLogger(){log.info("打印info日志");log.error("打印error日志");log.warn("打印warn日志");log.debug("打印debug日志");log.trace("打印trace日志");return "打印日志";}
}

通过结果我们可以看到, 同样可以正常打印日志.

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

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

相关文章

RK3568中使用QT opencv(显示基础图像)

文章目录 一、查看对应的开发环境是否有opencv的库二、QT使用opencv 一、查看对应的开发环境是否有opencv的库 在开发板中的/usr/lib目录下查看是否有opencv的库: 这里使用的是正点原子的ubuntu虚拟机,在他的虚拟机里面已经安装好了opencv的库。 二、…

LMI Gocator GO_SDK VS2019引用配置

LMI SDK在VS2019中的引用是真的坑爹,总结一下经验,希望后来的人能少走弯路.大致内容如下: (1) 环境变量 (2)C/C 附加包含目录 E:\GWQ\Gocator\GO_SDK\Gocator\GoSdk E:\GWQ\Gocator\GO_SDK\Platform\kApi (3&#…

模型I/O

文章目录 什么是模型I/O模型I/O功能之输出解析器输出解析器的功能输出解析器的使用Pydantic JSON输出解析器结构化输出解析器 什么是模型I/O 模型I/O在所有LLM应用中,核心元素无疑都是模型本身。与模型进行有效的交互是实现高效、灵活和可扩展应用的关键。LangChain…

C语言练习(31)

有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。 设5名学生的学号、姓名和3门课程成绩如下&am…

【Block总结】DynamicFilter,动态滤波器降低计算复杂度,替换传统的MHSA|即插即用

论文信息 标题: FFT-based Dynamic Token Mixer for Vision 论文链接: https://arxiv.org/pdf/2303.03932 关键词: 深度学习、计算机视觉、对象检测、分割 GitHub链接: https://github.com/okojoalg/dfformer 创新点 本论文提出了一种新的标记混合器(token mix…

「AI学习笔记」深度学习的起源与发展:从神经网络到大数据(二)

深度学习(DL)是现代人工智能(AI)的核心之一,但它并不是一夜之间出现的技术。从最初的理论提出到如今的广泛应用,深度学习经历了几乎一个世纪的不断探索与发展。今天,我们一起回顾深度学习的历史…

Axure PR 9 旋转效果 设计交互

大家好,我是大明同学。 这期内容,我们将学习Axure中的旋转效果设计与交互技巧。 旋转 创建旋转效果所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个按钮元件。 创建交互 创建按钮交互状态 1.选中按钮元件&#xf…

【外文原版书阅读】《机器学习前置知识》2.用看电影推荐的例子带你深入了解向量点积在机器学习的作用

目录 3.3 Where Are You Looking, Vector? The Dot Product 个人主页:Icomi 大家好,我是Icomi,本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的内容的一个输出,希望…

论文阅读(八):结构方程模型用于研究数量遗传学中的因果表型网络

1.论文链接:Structural Equation Models for Studying Causal Phenotype Networks in Quantitative Genetics 摘要: 表型性状可能在它们之间发挥因果作用。例如,农业物种的高产可能会增加某些疾病的易感性,相反,疾病的…

每日一题——序列化二叉树

序列化二叉树 BM39 序列化二叉树题目描述序列化反序列化 示例示例1示例2 解题思路序列化过程反序列化过程 代码实现代码说明复杂度分析总结 BM39 序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。二叉树的序列化是将二叉树按照某种遍历方式…

JVM_程序计数器的作用、特点、线程私有、本地方法的概述

①. 程序计数器 ①. 作用 (是用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令) ②. 特点(是线程私有的 、不会存在内存溢出) ③. 注意:在物理上实现程序计数器是在寄存器实现的,整个cpu中最快的一个执行单元 ④. 它是唯一一个在java虚拟机规…

Attention--人工智能领域的核心技术

1. Attention 的全称与基本概念 在人工智能(Artificial Intelligence,AI)领域,Attention 机制的全称是 Attention Mechanism(注意力机制)。它是一种能够动态分配计算资源,使模型在处理输入数据…

机器学习2 (笔记)(朴素贝叶斯,集成学习,KNN和matlab运用)

朴素贝叶斯模型 贝叶斯定理: 常见类型 算法流程 优缺点 集成学习算法 基本原理 常见方法 KNN(聚类模型) 算法性质: 核心原理: 算法流程 优缺点 matlab中的运用 朴素贝叶斯模型 朴素贝叶斯模型是基于贝叶斯…

智慧园区系统助力企业智能化升级实现管理效率与安全性全方位提升

内容概要 在当今数字化转型的浪潮中,企业面临着前所未有的挑战和机遇。智慧园区系统作为一种创新性解决方案,正在快速崛起,帮助企业实现全面的智能化升级。这套系统不仅仅是一个简单的软件工具,而是一个强大的综合管理平台&#…

【视频+图文详解】HTML基础4-html标签的基本使用

图文教程 html标签的基本使用 无序列表 作用&#xff1a;定义一个没有顺序的列表结构 由两个标签组成&#xff1a;<ul>以及<li>&#xff08;两个标签都属于容器级标签&#xff0c;其中ul只能嵌套li标签&#xff0c;但li标签能嵌套任何标签&#xff0c;甚至ul标…

电子电气架构 --- 在智能座舱基础上定义人机交互

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

SAP SD学习笔记27 - 请求计划(开票计划)之1 - 定期请求

上两章讲了贩卖契约&#xff08;框架协议&#xff09;的概要&#xff0c;以及贩卖契约中最为常用的 基本契约 - 数量契约和金额契约。 SAP SD学习笔记26 - 贩卖契约(框架协议)的概要&#xff0c;基本契约 - 数量契约_sap 框架协议-CSDN博客 SAP SD学习笔记27 - 贩卖契约(框架…

Ansible自动化运维实战--fetch、cron和group模块(5/8)

文章目录 一、fetch 模块1.1、功能1.2、常用参数1.3、测试1.4、注意事项 二、cron 模块2.1、功能2.2、常用参数2.3、注意事项 三、group模块3.1、功能3.2、常用参数3.3、例子3.4、注意事项 一、fetch 模块 1.1、功能 fetch 模块的主要功能是将远程主机上的文件复制到本地控制…

C++中常用的十大排序方法之1——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的相关…

商密测评题库详解:商用密码应用安全性评估从业人员考核题库详细解析(8)

1. 重要领域网络和信息系统的范畴 题目 根据《商用密码应用安全性评估管理办法(试行)》,下列哪些属于重要领域网络和信息系统( )。 A. 基础信息网络 B. 面向社会服务的政务信息系统 C. 重要工业控制系统 D. 以上都是 答案 D 答案解析 依据《商用密码应用安全性评…