Spring Boot 日志 (初级)

什么是日志呢?其实就是一条条的打印语句,我们就可以根据打印出来的日志,去分析程序存在的问题等。虽然作为后端开发人员,日志并不是那么重要,但是在学习的过程中,也是比较重要的,可以使用在我们的项目中,所以我们也要去学习和了解。

目录

1.日志的作用

2.日志的使用

3.日志的格式和等级

4.配置日志和持久化

5.更加简单的日志打印​​​​​​​

1.日志的作用

先笼统的介绍几个作用

(1)系统监控

比如,可以监控系统,查看是否被攻击,都会记录下每一个客户端的行为(访问了哪些方法等)

(2)数据采集

比如,收集客户端的喜好等

(3)日志审计

这种一般是国家需要等

上面的几个作用看起来非常的高大尚,似乎对于现在的我们来说好像没多大作用,但是不仅有上面的作用,还有下面更贴切我们的实际意义。

第一:可以应用于我们的程序中,更好的排查和发现程序bug和问题

第二:可以使用在项目中,使项目更加的丰富

第三:可以装逼。毕竟这个词在外行人听起来,就是比较高大尚。

下面,我们就来学习如何去使用吧!

2.日志的使用

我们不使用System.out.println()去打印日志只有一句话,看起来非常的丑陋;我们看一下Spring打印的日志

看起来也是非常的beautifu,那它是如何实现的呢?请看vcr

(1)日志打印说明

我们打印日志都将会使用一个框架:slf4j (撒拉佛接),Spring也内置了该框架,所以我们只需要学习如何使用即可。

打印日志的步骤:一:获取日志对象 ;二:使用日志对象进行打印日志

(2)第一:获取日志对象

获取日志对象会使用一个工厂对象,直接调用并且接收即可。

完整代码:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LogController {private static Logger log = LoggerFactory.getLogger(LogController.class);
}

代码解释:

工厂类需要一个参数,就是类名。

作用:日志需要知道是哪一个类下的方法,也就是用来定位。

拥有了日志对象,我们就可以打印日志了

(3)第二:使用日志对象打印日志

import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;@Controller
public class LogController {private static Logger log = LoggerFactory.getLogger(LogController.class);@PostConstructpublic void print() {System.out.println("===========================================");System.out.println("打印日志ing");log.info("打印日志ing");System.out.println("===========================================");}
}

打印结果:

我去,使用slf4j打印出的日志咋这么好看,跟系统日志一样,爱了爱了。

3.日志的格式和等级

(1)日志的格式

        上面我们介绍了日志的使用,下面先学习一下上述日志打印的格式

上述就是日志的格式了,其中有几处注意事项:

  • 配置的项目名称:

  • 打印日志的对象:

  • 日志的级别:这里我们下面直接介绍

(2)日志的级别

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

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

上述就是日志的各种级别,下面我们来观察日志框架默认可以打印出的日志级别

打印结果:

由此可见,slf4j框架默认打印的日志级别就是:info、warn、error,最高等级的直接没有,两个最低等级的默认不保留。

那还有什么办法可以保留指定等级的日志呢?答案当然是有的,那就是通过配置文件去配置即可

4.配置日志和持久化

首先,我们先来介绍日志的配置,上述我们知道,默认打印的日志级别是info及以上的,也就是debug和trace是不会打印。

(1)日志的配置

我们设置日志的级别是设置在某个目录下的最低级别日志是多少

  • 设置所有的路径下日志级别是:debug

然后运行发现:非常多的日志都打印出来了

  • 我们再配置回info级别:

我们发现:跟没有配置级别的是一样的。得出配置日志的作用:当年配置了某个路径下的日志级别后,那么该路径下系统打印出的日志级别就是我们配置的,但是其他路径依然是info

  • 我们现在来只设置我们包下的日志级别:

运行结果:debug的日志也可以打印出来了

OK,日志级别的配置到这里就完了,但是还是不推荐我们去随意配置日志级别。

(2)日志的持久化

上面我们使用的日志,都是打印在控制台上的,程序一结束就不见了,只有保存在外存上(硬盘)才能做到持久化,下面我们介绍日志如何保存在文件上。

  • 把日志保存在指定的文件目录下:

yml格式:

logging:file:path: D:/JavaCode/logger

程序运行后:

上面这种是配置文件路径,也就是会保存在指定问文件目录下。

  • 给日志配置指定文件名(项目中)

yml格式:

logging:file:name: xxxx

运行结果:

上面这种配置文件名字,得出的文件路径会跟随着项目的路径

注意点:如果上述的path和name同时设置,会以name为准,也就是以name为优先级

  • 配置日志文件的分割

yml格式:

logging:logback:rollingpolicy:max-file-size: 1KB

我们配置文件大小到底1kb就进行切割,也就是换一个文件进行存储。 

运行后:当大小到达1kb后,就进行了分割

对于日志,还有很多格式,比如说日志的格式,颜色等,这里就不介绍了

5.更加简单的日志打印

虽然说,我们目前的日志打印已经非常快了,但是还是很繁琐,下面介绍使用注解来打印日志

分成两步:第一步:添加lombok框架支持(导入依赖)第二步:使用@slf4j注解输出日志

(1)第一步:导入依赖

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

我们在创建项目的时候已经存在了,就不需要再导入

(2)第二步:代码编写(使用注解):@Slf4j

import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
@Slf4j
@Controller
public class LogController {//private static Logger log = LoggerFactory.getLogger(LogController.class);@PostConstructpublic void print() {System.out.println("===========================================");//System.out.println("打印日志ing");log.trace("我是trace日志");log.debug("我是debug日志");log.info("我是info日志");log.warn("我是warn日志");log.error("我是error日志");System.out.println("===========================================");}
}

该注解默认的对象名字是:log,所以我们直接使用即可,下面看一下运行结果。

结果也是一样的,所以我们后续就直接使用注解去打印日志即可。


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

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

相关文章

[Spring] Spring配置文件

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

主流大数据调度工具DolphinScheduler之数据采集

今天继续给大家分享主流大数据调度工具DolphinScheduler&#xff0c;以及数据的ETL流程。 一&#xff1a;调度工具DS 主流大数据调度工具DolphinScheduler&#xff0c; 其定位&#xff1a;解决数据处理流程中错综复杂的依赖关系 任务支持类型&#xff1a;支持传统的shell任…

数据结构之字符串的最长公共子序列问题详解与示例(C,C++)

文章目录 1、最长公共子序列定义2、动态规划解法3、状态转移方程初始化构建最长公共子序列 4、C 和 C 实现示例C 语言实现C 语言实现 5、总结 字符串的最长公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;是计算机科学中的一个经典问题&#xff0c;属于动态…

接口开发:Orcal数据库的批量新增sql

场景&#xff1a;在日常的CURD中一定会用到批量新增。在我们的项目中&#xff0c;使用的数据库是Orcal&#xff0c;由于之前基本都是使用Mysql的&#xff0c;使用的sql语句也基本都是用mysql的。但是在这次的接口编写时用mysql的批量新增出了问题&#xff0c;刚开始我还以为是写…

[MySQL]02 存储引擎与索引,锁机制,SQL优化

Mysql存储引擎 可插拔式存储引擎 索引是在存储引擎底层上实现的 inno DB MySQL默认存储引擎: inno DB高可靠性和高性能的存储引擎 DML操作遵循ACID模型支持事务行级锁,提高并发访问性能支持外键 约束,保证数据完整性和可靠性 MySAM MySAM是MySQL的早期引擎 特点: 不支持事…

OmniFocus4 归档和备份

归档和备份 当您的数据库变得臃肿、缓慢或者充斥着过时内容时&#xff0c;或者您需要回到之前的数据版本时&#xff0c;OmniFocus for Mac 的归档和备份功能可以帮您实现心愿。 创建归档 每天使用 OmniFocus 后不久&#xff0c;数据库可能会变得很大&#xff0c;在与移动设备…

安装 VMware vSphere vCenter 8.0

安装 VMware vSphere vCenter 8.0 1、运行安装程序 2、语言选择中文 3、点下一步 4、接受许可协议&#xff0c;点下一步 5、填写部署vCenter服务的ESXI主机IP地址以及对应ESXI主机的账号密码&#xff0c;这里将vCenter服务部署在192.168.1.14这台ESXi主机上 6、接受证书警告 7…

自动化测试中如何应对网页弹窗的挑战!

在自动化测试中&#xff0c;网页弹窗的出现常常成为测试流程中的一个难点。无论是警告框、确认框、提示框&#xff0c;还是更复杂的模态对话框&#xff0c;都可能中断测试脚本的正常执行&#xff0c;导致测试结果的不确定性。本文将探讨几种有效的方法来应对网页弹窗的挑战&…

21k star 开源项目,让模糊图像秒变高清!

不知道大家有没有遇到这样的需求&#xff1a;电脑里有一些很久之前保存的好看的图片&#xff0c;但是因为分辨率不高&#xff0c;当做壁纸使用会变得模糊。或者是从网上下载的需要使用的图片&#xff0c;找不到更高清的版本导致使用效果不好。之前分享过基于 Real-ESRGAN 算法修…

Redis中的哨兵(Sentinel)

上篇文章我们讲述了Redis中的主从复制&#xff08;Redis分布式系统中的主从复制-CSDN博客&#xff09;&#xff0c;本篇文章针对主从复制中的问题引出Redis中的哨兵&#xff0c;希望本篇文章会对你有所帮助。 文章目录 一、引入哨兵机制 二、基本概念 三、主从复制的问题 四、哨…

autosar mcal I2C

autosar mcal I2C 1. I2C 基本参数1.1 I2C通信总线基本概念1.2 I2C通信速率1.3 I2C 通信地址2. I2C数据格式2.1 I2C 写2.2 读操作3. I2C EB trosos配置4. I2C使用思考1. I2C 基本参数 [!warning] AUTOSAR 无IIC I2C不是一个标准的AUTOSAR 驱动模块,但是大部分芯片厂商会把它封…

php相关

php相关 ​ 借鉴了小迪安全以及各位大佬的博客&#xff0c;如果一切顺利&#xff0c;会不定期更新。 如果感觉不妥&#xff0c;可以私信删除。 默认有php基础。 文章目录 php相关1. php 缺陷函数1. 与2. MD53. intval()4. preg_match() 2. php特性1. php字符串解析特性2. 杂…

【MySQL进阶篇】存储对象:视图、存储过程及触发器

一、视图 1、介绍 视图&#xff08;view&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来定义视图的查询中使用的表&#xff08;基表&#xff09;&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#xff0c;视图只保存了…

Android笔试面试题AI答之Activity(2)

答案仅供参考&#xff0c;大部分为文心一言AI作答 目录 1. 请介绍一下Activity 生命周期&#xff1f;1. 完全生命周期2. 可见生命周期3. 前台生命周期4. 配置更改5. 特殊场景 2. 请介绍一下横竖屏切换时Activity的生命周期变化&#xff1f;1.默认行为&#xff08;未设置androi…

Cisco 路由重发布 —— 实现路由信息在不同路由域间的传递

一、技术背景 在实际的组网中&#xff0c;可能会遇到这样一个场景&#xff1a;在一个网络中同时存在两种或者两种以上的路由协议。例如客户的网络原先是纯 Cisco 的设备&#xff0c;使用 EIGRP 协议将网络的路由打通。但是后来网络扩容&#xff0c;增加了一批华为的设备&#…

【题解 Kruskal重构树 LCA】 星际导航

星际导航 分析&#xff1a; 这也是一个比较老的题目了 今天突然想学一下kruskal重构树&#xff0c;就做到了这个题。 首先我们要明白&#xff0c;为什么这道题的路径一定是在最小生成树里&#xff1f; 或许是我们惯有的经验&#xff1a;最小的最大或者最大的最小无非两种套路…

信号【Linux】

文章目录 信号处理方式&#xff08;信号递达&#xff09;前后台进程 终端按键产生信号kill系统调用接口向进程发信号阻塞信号sigset_tsigprocmasksigpending内核态与用户态&#xff1a;内核空间与用户空间内核如何实现信号的捕捉 1、信号就算没有产生&#xff0c;进程也必须识别…

题解:T480718 eating

eating 题目背景 从前有个荣光的王国&#xff0c;小 A 是里面的国王&#xff0c;今天他要赐予他的子民以仓廪。 题目描述 在一条街上有 n n n 个饭店。小 A 站在这条街的最左端。 第 i i i 个饭店离这条街最左端的距离是 a i a_i ai​&#xff0c;它所售卖的菜品的美味…

【C++】C++类和对象详解(上)

目录 思维导图大纲&#xff1a; 思维方面&#xff1a; 1. 类的定义&#xff1a; 2. 类的特点&#xff1a; 3. this指针&#xff1a; 4. 类的默认成员函数 默认构造函数 1.构造函数 2.析构函数 3.拷贝构造函数 4. 赋值运算符重载 1. 运算符重载 5. 日期类实现&#…

【CPP】CPP的内存管理

目录 10 C/C内存管理10.1 内存分布10.2 C的动态内存管理10.3 C的内存管理10.4 new失败的检测10.5 operator new与operator delete函数10.5 new与malloc()的区别,delete与free()的区别10.6 定位new表达式 这里是oldking呐呐,感谢阅读口牙!先赞后看,养成习惯! 个人主页:oldking呐…