[Spring] Spring日志

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:
🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm=1001.2014.3001.5482
🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
🍃 Spring(97平均质量分)https://blog.csdn.net/2301_80050796/category_12724152.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
在这里插入图片描述

目录

  • 1. 日志的使用
    • 1.1 打印日志
    • 1.2 日志框架
      • 1.2.1 门面模式(外观模式)
      • 1.2.2 slf4j框架介绍
    • 1.3 日志格式说明
    • 1.4 日志级别
      • 1.4.1 日志级别的分类
      • 1.4.2 日志级别的使用
    • 1.5 日志配置
      • 1.5.1 配置日志级别
      • 1.5.2 日志持久化(把日志存储在硬盘中)
      • 1.5.3 配置日志文件的分割
  • 2. 更简单的日志输出

1. 日志的使用

在SpringBoot项目启动的时候,就会默认有日志输出.
在这里插入图片描述
如果我们使用sout去打印日志,那么日志就不会像Spring默认的这样打印出来,只会打印规定输出的内容,相比这些缺少了很多的信息.
我们为了打印出信息更加齐全的日志,Spring内置了日志的框架,叫做Slf4j ,我们可以直接在程序中调用Slf4j 来输出日志.

1.1 打印日志

打印日志有以下两个步骤:

  1. 在程序中获取到日志对象.
    在程序中获取日志对象的时候,我们需要使用到一个工厂类,叫做LoggerFactory,我们称它为日志工厂.代码如下:
package com.jrj.logger;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LoggerDemo {public static Logger logger = LoggerFactory.getLogger(LoggerDemo.class);
}

需要注意的是,在输入Logger这个类之后,编译器会有很多的提示,一定要选择slf4j这个包下的一个接口,不要选错了.还有,工厂类后面方法中的参数传入的是一个类对象,这个括号中传入的是哪个类的类对象,就表示哪个类在打印日志.

  1. 使用日志对象输出要打印的内容.
    使用日志对象打印的方式有好多种.我们先通过logger对象调用info方法来输出日志:
@RestController
public class LoggerDemo {public static Logger logger = LoggerFactory.getLogger(LoggerDemo.class);@PostConstructpublic static String printLogger(){logger.info("打印日志");return "打印日志";}
}

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

1.2 日志框架

在这里插入图片描述
日志其实并不是由slf4j自己实现的,它只是⼀个抽象层,对日志框架制定的⼀种规范,标准,接口.真正实现日志的其实是底层的logback,所以slf4j不可以单独使用,需要搭配具体的日志框架来使用.

1.2.1 门面模式(外观模式)

在slf4j中使用了一种典型的设计模式,叫做门面模式.
门面模式又称为外观模式,提供了⼀个统⼀的接口,用来访问子系统中的⼀群接口.其主要特征是定义了⼀个高层接口,让子系统更容易使用.
在这里插入图片描述

  • 门面模式中主要包含两种角色
  1. 门面角色,是系统对外提供的统一的接口,也叫外观角色.
  2. 子系统角色,可以同时有⼀个或多个SubSystem,每个SubSytem都不是⼀个单独的类,而是⼀个类的集合.

举例说明:去医院看病
病人去医院看病,可能要去挂号,就诊,化验,取药等一系列繁杂的操作,让患者和家属觉得很麻烦,这事如果医院有一个接待人员,就会方便很多.
在这里插入图片描述

  • 实现门面模式
    场景:家里的灯,各个屋子都有各自的开关,可以控制各个屋子的灯,在门口的地方有一个总开关,可以控制所有的灯.一关全关.
public interface ILight {void on();//开灯接口void off();//关灯接口
}
public class LivingroomLight implements ILight{@Overridepublic void on() {System.out.println("打开客厅灯");}@Overridepublic void off() {System.out.println("关闭客厅灯");}
}
public class BedroomLight implements ILight{@Overridepublic void on() {System.out.println("打开卧室灯");}@Overridepublic void off() {System.out.println("关闭卧室灯");}
}
public class FacadeLight implements ILight{public LivingroomLight livingroomLight = new LivingroomLight();public BedroomLight bedroomLight = new BedroomLight();@Overridepublic void on() {livingroomLight.on();bedroomLight.on();}@Overridepublic void off() {livingroomLight.off();bedroomLight.off();}
}

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

1.2.2 slf4j框架介绍

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

  • 不引入日志门面
    假如一个项目你已经依赖了log4j日志框架,假如你依赖的另一个类库假如是Apache Active MQ,它依赖的日志框架是logback日志框架,那么你需要把logback也导入进去.
    存在的问题:
  1. 不同日志框架的API接口和配置文件不同,如果多个日志框架共存,那么不得不维护多套配置文件(这个配置文件是指用户自定义的配置文件).
  2. 如果要更换日志框架,应用程序将不得不修改代码,并且修改过程中可能会存在⼀些代码冲突.
  3. 如果引入的第三方框架,使用了多套,那就不得不维护多套配置.
    在这里插入图片描述
  • 引入日志门面
    应用程序和日志框架(框架的具体实现)之间有了统⼀的API接口(门面日志框架实现),此时应用程序只需要维护⼀套日志文件配置,且当底层实现框架改变时,也不需要更改应用程序代码.
    在这里插入图片描述
    其中我们的slf4j就是一个日志门面,它会把底层的日志框架统一起来,之后使用统一的接口来提供给用户.使你的代码独立于任何一个特定的日志框架API.

1.3 日志格式说明

在这里插入图片描述

  1. 日志打印时间,可以精确到毫秒.
  2. 日志级别,分为ERROR,WARN,INFO,DEBUG或TRACE
  3. 进程ID
  4. 打印日志的项目(项目名称取决于配置文件)
  5. 线程名称.
  6. Logger名
  7. 日志内容.

1.4 日志级别

1.4.1 日志级别的分类

日志级别代表着日志信息对应问题的严重性,为了更快的筛选符合目标的日志信息.
日志的级别从高到低依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE.
• FATAL:致命信息,表示需要立即被处理的系统级错误.
• ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行.
• WARN:警告信息,不影响使用,但需要注意的问题
• INFO:普通信息,用于记录应用程序正常运行时的⼀些信息,例如系统启动完成、请求处理完成等.
• DEBUG:调试信息,需要调试时候的关键信息打印.
• TRACE:追踪信息,比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使用DEBUG级别替代)
级别顺序:
在这里插入图片描述

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

1.4.2 日志级别的使用

打印日志的级别,可由开发人员根据信息的重要程度和自己的理解自己设置日志级别.针对这些不同的日志级别,Logger对象也提供了不同的方法来打印不同级别的日志.

@RestController
public class LoggerDemo {public static Logger logger = LoggerFactory.getLogger(LoggerDemo.class);@PostConstructpublic static String printLogger(){logger.info("打印info日志");logger.error("打印error日志");logger.warn("打印warn日志");logger.debug("打印debug日志");logger.trace("打印trace日志");return "打印日志";}
}

在这几个日志级别中,默认fatal(被映射到了error级别),debug,trace这几个级别的日志不会输出.但是可以通过配置文件修改起始打印级别.
在这里插入图片描述

1.5 日志配置

上述是日志的使用,日志框架支持我们更灵活的输出日志,包括内容,格式等.

1.5.1 配置日志级别

日志级别配置只需要在配置文件中设置"logging.level"配置项即可,如下:(以yml文件格式为例)

logging:level:root: debug

我们看到,debug级别的日志也被打印了出来.
在这里插入图片描述
这里其中的root表示的是该项目下的所有文件的日志,我们也可以通过在level下面加上软件包的树形结构来限定只有规定包下文件的日志从指定级别开始打印.

logging:level:com:jrj:logger: trace

我们看到只有我们刚刚自己写的日志被打印了出来,没有像上面打印的那么多的信息.
在这里插入图片描述

1.5.2 日志持久化(把日志存储在硬盘中)

我们之前的日志都是在控制台上打印日志,这就意味着日志在内存中,如何在硬盘中永久存储日志呢?
日志持久化有两种方式:

  1. 配置日志文件的文件名,文件名中既可以设置路径,又可以设置文件名.
logging:level:com:jrj:logger: tracefile:name: logger/springLogger.log

file下面的几行就是在使用文件名配置日志文件.
在这里插入图片描述
我们看到在项目的目录之下,多出了一个logger的目录,目录中就存储的是指定路径之下的日志.
[注意]

  • 日志在log文件中存储的时候是以追加的形式存储的,当我们再次运行项目的时候,如果不改变配置文件中的文件名,新的日志就会追加在下面.
    在这里插入图片描述
  • 配置文件中如果是同一个配置项在配置文件中不可以出现两次或以上,需要把他们合并到一起.
  1. 配置日志文件的存储路径,可以是相对路径,可以是绝对路径.路径中只可以设置路径.
logging:level:com:jrj:logger: tracefile:path: D:/personal

在这里插入图片描述
我们看到日志文件被保存在了指定的路径之下.
[注意] 如果name和path两个配置项同时存在的时候,优先使用name配置项.

1.5.3 配置日志文件的分割

如果日志一直不停地产生的话,日志文件就会越来越大.此时需要对项目的日志进行分割.当然,日志框架也考虑到了这一点,没有配置参数的默认情况下,一个日志文件满10M就会自动进行分割.

  • 配置项
    在这里插入图片描述
logging:file:path: D:/personallogback:rollingpolicy:file-name-pattern: ${spring_log}.%d{yyyy-MM-dd}.%i.gzmax-file-size: 2KB

上面的参数分别表示的是,分割后文件的名字,格式就是文件名+日期+索引+文件格式,以及一个日志文件的最大大小.

2. 更简单的日志输出

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

  1. 添加lombok依赖
  2. 使用@Slf4j注解产生Logger对象,使用注解产生的对象进行日志输出.产生的这个对象默认的名字是log.注意注解中的首字母是大写的.
@RestController
@Slf4j
public class LoggerDemo {@PostConstructpublic static String printLogger(){log.info("打印info日志");log.error("打印error日志");log.warn("打印warn日志");log.debug("打印debug日志");log.trace("打印trace日志");return "打印日志";}
}

运行结果:
在这里插入图片描述
同样可以打印自定义的日志.

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

python实现责任链模式

把多个处理方法串成一个list。下一个list的节点是上一个list的属性。 每个节点都有判断是否能处理当前数据的方法。能处理,则直接处理,不能处理则调用下一个节点(也就是当前节点的属性)来进行处理。 Python 实现责任链模式&#…

在浏览器中测试JavaScript代码方法简要介绍

在浏览器中测试JavaScript代码方法简要介绍 在浏览器中测试JavaScript代码是前端开发中的一个重要技能。方法如下: 1. 浏览器控制台 最简单和直接的方法是使用浏览器的开发者工具中的控制台(Console)。 步骤: 在大多数浏览器…

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 目录 Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 一、简单介绍 二、共享纹理 1、共享纹理的原理 2、共享纹理涉及到的关键知识点 3、什么可以实现共享 不能实现共享…

有关于链表带环的两道OJ题目

目录 1.判断链表是否带环 1.1快指针的速度为慢指针的2倍 1.2快指针的速度为慢指针的3倍 2.找出带环链表开始入环的第一个节点 2.1将快慢指针相遇的节点与后面分开,构造交叉链表 2.2记录快慢指针相遇节点,与头结点一起向后走,相遇点为入…

远程开启空调,享受即刻凉爽

随着夏季的热浪逐渐侵袭,我们都渴望回到家中那一刻,能感受到一丝丝的凉意。但是,有时候,即使我们提前开窗通风,房间里的温度依然像烤箱一样闷热难耐。那么,有没有一种方法,能让我们在外头酷暑难…

升级Nvidia CUDA 遇到 sub-process /usr/bin/dpkg returned an error code (1)

1.问题描述 在自己Ubuntu22.04的服务器环境上存在cuda版本为11.5,按照官网教程升级为12.1运行安装命令 sudo apt-get -y install cuda 报错:sub-process /usr/bin/dpkg returned an error code (1) 官网教程: https://developer.nvidia…

PCIE软件基础知识

什么是PCIE PCIe,全称 Peripheral Component Interconnect Express,是一种高速串行计算机扩展总线标准,用于连接计算机内部的硬件组件,如显卡、存储设备、网络适配器等。PCIe是一种点对点的双向通信标准,这意味着它在发…

微信小程序canvas 使用案例(一)

一、cavans 对象获取、上线文创建 1.wxml <!-- canvas.wxml --><canvas type"2d" id"myCanvas"></canvas> 2.js /*** 生命周期函数--监听页面加载*/onLoad(options) {const query wx.createSelectorQuery()query.select(#myCanvas).f…

分离式网络变压器的集成化设计替代传统网络变压器(网络隔离滤波器)尝试

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;今天分享的是应用了分离式网络变压器设计的的新型网络变压器&#xff08;网络隔离变压器&#xff09; 今天我们一起来看这款新型网络变压器&#xff0c;它就是应用分离式网络变压器集成到电路板上&#xff0c;加上外…

CAS乐观锁原理

1、什么是CAS&#xff1f; compare and swap也就是比较和交换&#xff0c;他是一条CPU的并发原语。 他在替换内存的某个位置的值时&#xff0c;首先查看内存中的值与预期值是否一致&#xff0c;如果一致&#xff0c;执行替换操作。 这个操作是一个原子性操作。 Java中基于Un…

昇思学习打卡-21-生成式/Diffusion扩散模型

文章目录 Diffusion扩散模型介绍模型推理结果 Diffusion扩散模型介绍 关于扩散模型&#xff08;Diffusion Models&#xff09;有很多种理解&#xff0c;除了本文介绍的离散时间视角外&#xff0c;还有连续时间视角、概率分布转换视角、马尔可夫链视角、能量函数视角、数据增强…

虚拟机迁移报错:虚拟机版本与主机“x.x.x.x”的版本不兼容

1.虚拟机在VCenter上从一个ESXi迁移到另一个ESXi上时报错&#xff1a;虚拟机版本与主机“x.x.x.x”的版本不兼容。 2.例如从10.0.128.13的ESXi上迁移到10.0.128.11的ESXi上。点击10.0.128.10上的任意一台虚拟机&#xff0c;查看虚拟机版本。 3.确认要迁移的虚拟机磁盘所在位…

操作系统---死锁相关

目录 一. 基础概念死锁的定义死锁与饥饿死锁产生原因死锁产生的必要条件资源分配圈&#xff1a;循环等待 VS 死锁 死锁处理策略 二. 死锁预防破坏互斥条件破坏不可剥夺条件破坏请求并保持条件破坏循环等待条件 三. 死锁的避免系统安全状态银行家算法 四. 死锁检测和解除死锁检测…

Mysql注意事项(一)

Mysql注意事项&#xff08;一&#xff09; 最近回顾了一下MySQL&#xff0c;发现了一些MySQL需要注意的事项&#xff0c;同时也作为学习笔记&#xff0c;记录下来。–2020年05月13日 1、通配符* 检索所有的列。 不建议使用 通常&#xff0c;除非你确定需要表中的每个列&am…

微软研发致胜策略 06:学无止境

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1994 年发布。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Debugging the Development Process》&#xff0c;这本书详细阐述了软件开发过程中的常见问题及其解决方案&a…

【运维】软件运维方案(2024word完整版)

1. 文档介绍 2. 人员与责任 3. 运维过程内容 4. 运维资源 5. 运维服务规划保障 6. 事件处置 7. 质量改进 8. 运维边界及内容 获取方式&#xff1a; 本文末个人名片直接获取。

2024年技校大数据实验室建设及大数据实训平台整体解决方案

随着信息技术的迅猛发展&#xff0c;大数据已成为推动产业升级和社会进步的重要力量。为适应市场需求&#xff0c;培养高素质的大数据技术人才&#xff0c;技校作为职业教育的重要阵地&#xff0c;亟需加强大数据实验室的建设与实训平台的打造。本方案旨在提出一套全面、可行的…

宿舍生活新升级:智能指纹锁的便捷体验(嘉立创EDA设计)

宿舍生活新升级&#xff1a;智能指纹锁的便捷体验 引言 宿舍生活总是充满挑战和乐趣&#xff0c;但有时也会因为一些小事情而变得复杂。比如&#xff0c;忘记带钥匙或者需要频繁地给室友开门。随着科技的发展&#xff0c;智能设备逐渐走进我们的生活&#xff0c;为日常带来便…

土耳其媒体发稿深化项目投放战略-脱颖而出

土耳其媒体发稿深化项目投放战略-脱颖而出 一、土耳其媒体的发展概况 土耳其拥有丰富的媒体资源&#xff0c;其中包括许多知名的新闻机构和周刊。随着互联网的普及和信息传播方式的变革&#xff0c;土耳其媒体不断调整发展策略&#xff0c;通过深化项目投放和多元化传播&…

代码随想录——一和零(Leetcode474)

题目链接 0-1背包 class Solution {public int findMaxForm(String[] strs, int m, int n) {// 本题m&#xff0c;n为背包两个维度// dp[i][j]:最多右i个0和j个1的strs的最大子集大小int[][] dp new int[m 1][n 1];// 遍历strs中字符串for(String str : strs){int num0 …