【JavaEE】Spring Boot 日志

目录

  • 一、日志概述
  • 二、使用日志
    • 2.1 打印日志
    • 2.2 日志框架
      • 2.2.1 门面 / 外观 模式
    • 2.3 日志级别
      • 2.3.1 六大分类
      • 2.3.2 使用
    • 2.4 日志级别配置
    • 2.5 日志的持久化
    • 2.6 日志文件分割
    • 2.7 日志文件格式
    • 2.8 @Slf4j 简单打印日志

一、日志概述

⽇志主要是为了发现问题, 分析问题, 定位问题的, 但除此之外, ⽇志还有很多⽤途,像监控程序,当程序出现什么问题时,在日志中反应为相对应的日志,然后可以提醒程序猿。日志还可以记录数据,用于分析等等。

二、使用日志

我们先简单看一下一个Spring的日志包含的内容:

2.1 打印日志

我们在程序中打印SpringBoot的日志,我们先要拿到日志对象,在import org.slf4j包下的Logger对象。在从这个包下的静态类日志工厂 LoggerFactor拿到实例 。

 private Logger  logger = LoggerFactory.getLogger(LogController.class);

在通过Logger类中的info方法打印日志。

package com.example.captcha.Controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/log")
@RestController
public class LogController {private final static Logger  LOGGER = LoggerFactory.getLogger(LogController.class);@RequestMapping("/print")public String print() {LOGGER.info("日志");return "日志";}
}

得到的日志:

2.2 日志框架

在我们使用Logger类的时候,会有很多包。

这几个包的关系如下:

以电视机和遥控器来举例子,日志实现就相当于不同品牌的电视,而日志门面就相当于一个 通用的遥控器。

2.2.1 门面 / 外观 模式

门面模式:
⻔⾯模式(Facade Pattern)⼜称为外观模式, 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接口. 其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤.

⻔⾯模式主要包含2种⻆⾊:
外观⻆⾊(Facade): 也称⻔⾯⻆⾊,系统对外的统⼀接⼝.

⼦系统⻆⾊(SubSystem): 可以同时有⼀个或多个 SubSystem. 每个 SubSytem都不是⼀个单独的类, ⽽是⼀个类的集合. SubSystem 并不知道 Facade的存在, 对于 SubSystem ⽽⾔, Facade 只是另⼀个客⼾端⽽已(即 Facade 对 SubSystem 透明)

2.3 日志级别

2.3.1 六大分类

⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE

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

2.3.2 使用

对于不同级别的日志,SpringBoot的Logger类下面有对应名字的方法(FATAl)除外。

SpringBoot 默认的⽇志框架是Logback, Logback没有 FATAL 级别, 它被映射到 ERROR .出现fatal⽇志,表⽰服务已经出现了某种程度的不可⽤, 需要需要系统管理员紧急介⼊处理. 通常情况下, ⼀个进程⽣命周期中应该最多只有⼀次FATAL记录.

package com.example.captcha.Controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/log")
@RestController
public class LogController {private final static Logger  LOGGER = LoggerFactory.getLogger(LogController.class);@RequestMapping("/print")public String print() {//LOGGER.info("日志");LOGGER.trace("trace级别日志");LOGGER.debug("debug级别日志");LOGGER.info("info级别日志");LOGGER.warn("ware级别日志");LOGGER.error("error级别日志");return "日志";}
}

上诉代码的结果如下:

只会显示info级别及其以上级别的日志,这是因为Spring在默认的配置下是显示info级以上级别日志。

2.4 日志级别配置

我们只需要在配置文件加上:logging.level.目录就可以配置相对应目录下的日志显示级别。

如果我们在配置文件中加上这样的配置信息

logging:level:com:example:captcha:Controller: trace

那么我们打印的日志就会变成下面的这样:

2.5 日志的持久化

日志如果不进行配置,默认⽇志都是输出在控制台上的, 然⽽在线上环境中, 我们需要把⽇志保存下来, 以便出现问题之后追溯问题.把⽇志保存下来就叫持久化。
我们就可以将日志写入文件。
Spring中有以下两个配置项,来配置日志写入的文件。

  • logging.file.name配置项,可以包含文件的路径和文件名。
  • logging.file.path配置项,只能包含文件路径。
  • 当两个配置项同时存在的时候,只有logging.file.name会有作用。

我们进行如下配置:

logging:file:name: logger/log.logpath: all

得到如下结果:

2.6 日志文件分割

日志文件分割有以下两个相关的配置项:

  • logging.logback. rolling policy.max-file-size配置项,用于配置每个文件的大小。
  • logging.logback. rolling policy.file-name-pattern配置项,用于配置每个文件的名字及其格式。

我们写下如下配置:

logging:logback:rolling policy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz

结果就如下:

注意事项:

  • logging.logback. rolling policy.max-file-size配置项,并不是严格的每个文件都不会超过配置的大小,而是按照必须将当前的日志行写完才分割。
  • logging.logback. rolling policy.file-name-pattern配置项,默认格式${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz

2.7 日志文件格式

日志文件格式分割有以下两个相关的配置项:

配置项说明
logging.pattern.console控制台⽇志格式
logging.pattern.file⽇志⽂件的⽇志格式

配置项说明:

  1. %clr(表达式){颜⾊}设置输⼊⽇志的颜⾊。支持blue cyan faint green magenta red yellow
  2. %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd’T’HH:mm:ss.SSSXXX}} ⽇期和时间–精确到毫秒
  3. %5p 显⽰⽇志级别ERROR,MARN,INFO,DEBUG,TRACE.
  4. %t 线程名.
  5. %c 类的全限定名.
  6. %M method.
  7. %L 为⾏号.
  8. %thread 线程名称.
  9. %m 或者%msg 显⽰输出消息.
  10. %n 换⾏符
  11. %5 若字符⻓度⼩于5,则右边⽤空格填充.
  12. %-5 若字符⻓度⼩于5,则左边⽤空格填充.
  13. %.15 若字符⻓度超过15,截去多余字符.
  14. %15.15 若字符⻓度⼩于15,则右边⽤空格填充.若字符⻓度超过15,截去多余字符

2.8 @Slf4j 简单打印日志

我们可以使用lombok提供的@Slf4j注解来打印日志,这个注解的作用相当于就是sping帮我们创建Logger对象,对象名为log。

例如下面代码:

package com.example.captcha.Controller;import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/log")
@RestController
@Slf4j
public class LogController {@RequestMapping("/print")public String print() {//LOGGER.info("日志");log.trace("trace级别日志");log.debug("debug级别日志");log.info("info级别日志");log.warn("ware级别日志");log.error("error级别日志");return "日志";}
}

结果如下:

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

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

相关文章

代码随想录算法训练营第34天 | 62.不同路径 63. 不同路径 II 整数拆分 不同的二叉搜索树 (跳过)

62.不同路径 62. 不同路径 - 力扣(LeetCode) 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 代码随想录 视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_b…

uniapp APP权限弹框

效果图 第一步 新建一个页面,设置透明 {"path": "pages/permissionDisc/permissionDisc","style": {"navigationBarTitleText": "","navigationStyle": "custom","app-plus": {&…

网络安全证书培训机构有哪些

一、前言少叙 记得刚入行的时候,想考一个证书来装装门面,结果发现费用太高了,比当时一个月的工资都高,感叹网络安全这帮人真舍得花钱,遂放弃。后来入职网络安全公司,考了一个CISP,在工作中逐渐…

torch.argsorttorch.gather

文章目录 1. 举例说明2. pytorch 代码 1. 举例说明 torch.argsort 的作用是可以将矩阵中的元素进行从小到大排序,得到对应的序号。假设我们有一个向量a表示如下 a [ 8 , 7 , 6 , 9 , 7 ] \begin{equation} a[8,7,6,9,7] \end{equation} a[8,7,6,9,7]​​ 那么从小…

JSON数据格式介绍

2.5 JSON 2.5.1.JSON格式的用途 在开发中凡是涉及到『跨平台数据传输』,JSON格式一定是首选 2.5.2.JSON格式的说明 1.JSON数据两端要么是{},要么是[] {}定义JSON对象[]定义JSON数组 2.JSON对象的格式是:json {key:value,key:value,...,ke…

(性能测试)性能测试工具 2.jmeter的环境搭建 3jmeter元件和4使用实例 5jmeter元件和参数化

目录 性能测试工具 性能测试工具 jemeter环境搭建 jmeter的常用目录介绍 jmeter修改语言和主题--jmeter界面的汉化 jmeter元件 jmeter元件和组件的介绍 jmeter的作用域原则 jmeter的执行顺序 案例:执行顺序 jmeter使用案例 jmeter线程组的介绍 jmeter…

Qt程序基于共享内存读写CodeSys的变量

文章目录 1.背景2.结构体从CodeSys导出后导入到C2.1.将结构体从CodeSys中导出2.2.将结构体从m4文件提取翻译成c格式 3.添加RTTR注册信息4.读取PLC变量值5.更改PLC变量值6.Qt读写CodeSys的共享内存 1.背景 在文章【基于RTTR在C中实现结构体数据的多层级动态读写】中&#xff0c…

大模型架构全景解析:从Transformer到未来计算范式

1. Transformer 架构 核心模型 GPT-4、BERT、T5、LLaMA、通义千问、文心ERNIE 关键技术 多头注意力:GPT-4 使用 96 头注意力位置编码创新:LLaMA 采用 RoPE(旋转位置编码),Claude 3 引入 ALiBi归一化优化&#xff1…

AI第一天 自我理解笔记--微调大模型

目录 1. 确定目标:明确任务和数据 2. 选择预训练模型 3. 数据预处理 (1) 数据清洗与格式化 (2) 划分数据集 (3) 数据加载与批处理 4. 构建微调模型架构 (1) 加载预训练模型 (2) 修改模型尾部(适配任务) (3) 冻结部分层(可…

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言 卷积神经网络(Convolutional Neural Networks,简称 CNNs)是一种深度学习架构,专门用于处理具有网格结构的数据,如图像、视频等。它们在计算机视觉领域取得了巨大成功,成为图像分类、目标检测、图像分…

[C++面试] 关于deque

一、入门 1、deque与vector的区别 deque的迭代器包含以下信息: 当前缓冲区指针(current_buffer)当前元素在缓冲区内的位置(current)中控器的位置(map) 每次移动迭代器时,需检查是…

服务性能防腐体系:基于自动化压测的熔断机制

01# 背景 在系统架构的演进过程中,项目初始阶段都会通过压力测试构建安全护城河,此时的服务性能与资源水位保持着黄金比例关系。然而在业务高速发展时期,每个冲刺周期都被切割成以业务需求为单位的开发单元,压力测试逐渐从必选项…

SpringBoot 和vue前后端配合开发网页拼图10关游戏源码技术分享

今天分享一个 前后端结合 的网页游戏 开发项目源码技术。 这也是我第一次写游戏类的程序,虽然不是特别复杂的游戏,但是是第一次写,肯定要记录一下了,哈哈。 游戏的内容 就是 我们显示中玩的那个 拼图碎片的 游戏,类似下…

【k8s002】k8s健康检查与故障诊断

k8s健康检查与故障诊断 ‌一、集群状态检查‌ ‌检查节点健康状态‌ kubectl get nodes -o wide # 查看节点状态及基本信息 kubectl describe node <node-name> # 分析节点详细事件&#xff08;如资源不足、网络异常&#xff09; kubectl top nodes …

01-Canvas-使用fabric初始

fabric官网&#xff1a; https://fabric5.fabricjs.com/demos/ 创建画布并绘制 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

【机器学习-基础知识】统计和贝叶斯推断

1. 概率论基本概念回顾 1. 概率分布 定义: 概率分布(Probability Distribution)指的是随机变量所有可能取值及其对应概率的集合。它描述了一个随机变量可能取的所有值以及每个值被取到的概率。 对于离散型随机变量,使用概率质量函数来描述。对于连续型随机变量,使用概率…

常见限流算法及实现

1. 固定窗口计数器&#xff08;Fixed Window Counter&#xff09; 原理&#xff1a;在固定时间窗口&#xff08;如1分钟&#xff09;内统计请求数&#xff0c;超过阈值则拒绝后续请求。优点&#xff1a;实现简单&#xff0c;内存占用低。缺点&#xff1a;存在窗口切换时的流量…

《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现

《TCP/IP网络编程》学习笔记 | Chapter 18&#xff1a;多线程服务器端的实现 《TCP/IP网络编程》学习笔记 | Chapter 18&#xff1a;多线程服务器端的实现线程的概念引入线程的背景线程与进程的区别 线程创建与运行pthread_createpthread_join可在临界区内调用的函数工作&#…

创新实践分享:基于边缘智能+扣子的智能取物机器人解决方案

在 2024 年全国大学生物联网设计竞赛中&#xff0c;火山引擎作为支持企业&#xff0c;不仅参与了赛道的命题设计&#xff0c;还为参赛队伍提供了相关的硬件和软件支持。以边缘智能和扣子的联合应用为核心&#xff0c;参赛者们在这场竞赛中展现出了卓越的创新性和实用性&#xf…

QT:动态属性和对象树

动态对象 1.添加Q_PROPERTY对象 #ifndef MYPROPERTYCLASS_H #define MYPROPERTYCLASS_H#include <QObject>class MyPropertyClass : public QObject {Q_OBJECTQ_PROPERTY(QString mask READ mask WRITE setMask NOTIFY maskChanged) public:explicit MyPropertyClass(Q…