【JavaEE进阶】 Spring Boot⽇志

文章目录

  • 🎋关于日志
    • 🚩为什么要学习⽇志
    • 🚩⽇志的⽤途
    • 🚩日志的简单使用
  • 🎄打印⽇志
    • 🚩程序中得到⽇志对象
    • 🚩使⽤⽇志对象打印⽇志
  • 🎍⽇志格式的说明
    • 🚩⽇志级别的作用
    • 🚩⽇志级别的分类
    • 🚩⽇志级别的使⽤
  • 🍀⽇志配置
    • 🚩配置⽇志级别
    • 🚩⽇志持久化
    • 🚩配置⽇志⽂件分割
    • 🎋配置⽇志格式
  • 🎄更简单的⽇志输出
  • ⭕总结

🎋关于日志

🚩为什么要学习⽇志

在没有学习spring时,我们可能使⽤ System.out.print 来打印⽇志了.通过打印⽇志来发现和定位问题,或者根据⽇志来分析程序的运⾏过程.

在Spring的学习中,也经常根据控制台的⽇志来分析和定位问题.随着项⽬的复杂度提升,我们对⽇志的打印也有了更⾼的需求,⽽不仅仅是定位排查问题.

⽐如需要记录⼀些⽤⼾的操作记录(⼀些审计公司会要求),也可能需要使⽤⽇志来记录⽤⼾的⼀些喜好,⽇志持久化,后续进⾏数据分析等.

但是 System.out.print 不能很好的满⾜我们的需求,我们就需要使⽤⼀些专⻔⽇志框架(也就是专业的事情交给专业的⼈去做)

🚩⽇志的⽤途

⽇志除了发现问题,分析问题,定位问题等,⽇志还有很多⽤途

  1. 系统监控

监控现在⼏乎是⼀个成熟系统的标配,我们可以通过⽇志记录这个系统的运⾏状态,每⼀个⽅法的响应时间,响应状态等,对数据进⾏分析,设置不同的规则,超过阈值时进⾏报警.⽐如统计⽇志中关键字的数量,并在关键字数量达到⼀定条件时报警,这也是⽇志的常⻅需求之⼀

  1. 数据采集

数据采集是⼀个⽐较⼤的范围,采集的数据可以作⽤在很多⽅⾯,⽐如数据统计,推荐排序等.

  • 数据统计:统计⻚⾯的浏览量(PV),访客量(UV),点击量等,根据这些数据进⾏数据分析,优化公司运营 策略
  • 推荐排序:⽬前推荐排序应⽤在各个领域,我们经常接触的各⾏各业很多也都涉及推荐排序,⽐如购物,⼴告,新闻等领域.数据采集是推荐排序⼯作中必须做的⼀环,系统通过⽇志记录⽤⼾的浏览历史,停留时⻓等,算法⼈员通过分析这些数据,训练模型,给⽤⼾做推荐.
    下图中的数据源,其中⼀部分就来⾃于⽇志记录的数据
    在这里插入图片描述
  1. ⽇志审计

随着互联⽹的发展,众多企业的关键业务越来越多的运⾏于⽹络之上.⽹络安全越来越受到⼤家的关注,系统安全也成为了项⽬中的⼀个重要环节,安全审计也是系统中⾮常重要的部分.国家的政策法规、⾏业标准等都明确对⽇志审计提出了要求.通过系统⽇志分析,可以判断⼀些⾮法攻击,⾮法调⽤,以 及系统处理过程中的安全隐患

  • ⽐如,⼤家平时都在做运营系统,其中运营⼈员在通过界⾯处理⼀些数据的时候,如果没有清楚的⽇志操作记录,⼀条数据被删除或者修改,你是⽆法找到是谁操作的,但是如果你做了相应的记录,该数据被谁删除或者修改就会⼀⽬了然.还有⼀些内部的违规和信息泄漏(⽐如客⼾信息被卖掉)现象出现后,如果未记录留存⽇志,为事后调查提供依据,则事后很难追查(⼀些公司查看客⼾的信息都会被记录⽇志,如果频繁查询也会报警

🚩日志的简单使用

Spring Boot项⽬在启动的时候默认就有⽇志输出,如下图所⽰:
在这里插入图片描述
接下来我们看一下我们自己使用System.out.print打印一个日志

@RestController
public class LoggerController {@RequestMapping("/logger")public String logger() {System.out.println("我是日志");return "日志打印成功!!!";}
}

在这里插入图片描述
可以看到,我们通过 System.out.print 打印的⽇志,⽐ SpringBoot 打印的⽇志缺少了很多信息.

SpringBoot内置了⽇志框架 SLF4J ,我们可以直接在程序中调⽤ SLF4J来输出⽇志

🎄打印⽇志

打印⽇志的步骤:

  1. 在程序中得到⽇志对象.

  2. 使⽤⽇志对象输出要打印的内容

🚩程序中得到⽇志对象

在程序中获取⽇志对象需要使⽤⽇志⼯⼚LoggerFactory,如下代码所⽰:

private static Logger logger = LoggerFactory.getLogger(类名.class);

LoggerFactory.getLogger需要传递⼀个参数,标识这个⽇志的名称.这样可以更清晰的知道是哪个类输出的⽇志.当有问题时,可以更⽅便直观的定位到问题类

使用注意事项:

  • Logger对象是属于org.slf4j包下的,不要导⼊错包.
    在这里插入图片描述
    在这里插入图片描述

🚩使⽤⽇志对象打印⽇志

⽇志对象的打印⽅法有很多种,这里我们先使⽤info()⽅法来输出⽇志,如下代码所⽰:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LoggerController {private static Logger logger =  LoggerFactory.getLogger(LoggerController.class);;@RequestMapping("/logger")public String logger() {logger.info("======我是日志======");return "日志打印成功!!!";}
}

打印日志如下:

在这里插入图片描述

🎍⽇志格式的说明

日志的每一项代表着什么呢?

在这里插入图片描述

从上图可以看到,⽇志输出内容元素具体如下:

  1. 时间⽇期:精确到毫秒

  2. ⽇志级别:ERROR,WARN, INFO,DEBUG或TRACE

  3. 进程ID

  4. 线程名

  5. Logger名(通常使⽤源代码的类名)

  6. ⽇志内容

🚩⽇志级别的作用

⽇志级别代表着⽇志信息对应问题的严重性,为了更快的筛选符合⽬标的⽇志信息.

试想⼀下这样的场景,假设你是⼀家2万⼈公司的⽼板,如果每个员⼯的⽇常⼯作和琐碎的信息都要反馈给你,那你⼀定⽆暇顾及.于是就有了组织架构,⽽组织架构就会分级,有很多的级别设置,如下图所⽰:
在这里插入图片描述

有了组织架构之后,就可以逐级别汇报消息了,例如:组员汇报给组⻓,组⻓汇报给研发⼀组,研发⼀组

汇报给Java研发,等等依次进⾏汇报.

⽇志级别⼤概是同样的道理,有了⽇志级别之后就可以过滤⾃⼰想看到的信息了,⽐如只关注error级别的,就可以根据级别过滤出来error级别的⽇志信息,节约开发者的信息筛选时间

🚩⽇志级别的分类

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

  • FATAL:致命信息,表⽰需要⽴即被处理的系统级错误.

  • ERROR:错误信息,级别较⾼的错误⽇志信息,但仍然不影响系统的继续运⾏.

  • WARN:警告信息,不影响使⽤,但需要注意的问题

  • INFO:普通信息,⽤于记录应⽤程序正常运⾏时的⼀些信息,例如系统启动完成、请求处理完成等.

  • DEBUG:调试信息,需要调试时候的关键信息打印.

  • TRACE:追踪信息,⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)

这里需要注意一点:⽇志级别通常和测试⼈员的Bug级别没有关系.

  • ⽇志级别是开发⼈员设置的,⽤来给开发⼈员看的.⽇志级别的正确设置,也与开发⼈员的⼯作经验有关.如果开发⼈员把error级别的⽇志设置成了info,就很有可能会影响开发⼈员对项⽬运⾏情况的判断.出现error级别的⽇志信息较多时,可能也没有任何问题.测试的bug级别更多是依据现象和影响范 围来判断

⽇志级别的顺序如下图所示:
在这里插入图片描述

级别越⾼,收到的消息越少

🚩⽇志级别的使⽤

⽇志级别是开发⼈员⾃⼰设置的.开发⼈员根据⾃⼰的理解来判断该信息的重要程度

针对这些级别,Logger对象分别提供了对应的⽅法,来输出⽇志

@PostConstruct
public String printLog() {logger.trace("================= 我是trace ===============");logger.debug("================= 我是debug ===============");logger.info("================= 我是info ===============");logger.warn("================= 我是warn ===============");logger.error("================= 我是error ===============");return "打印不同级别的⽇志" ;
}

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

打印结果如下:

在这里插入图片描述

我们发现,只打印了info,warn和error级别的⽇志

这就与⽇志级别的配置有关,⽇志的输出级别默认是info级别,所以只会打印⼤于等于此级别的⽇志,也就是info,warn和error.

🍀⽇志配置

上述讲的是⽇志的使⽤,⽇志框架还⽀持我们更灵活的输出⽇志,包括内容,格式等

🚩配置⽇志级别

⽇志级别配置只需要在配置⽂ 件中设置"logging.level"配置项即可,我们将默认输出级别改为debug 如下所⽰,

logging:level:root: debug

我们再次进行打印,看一看效果:

在这里插入图片描述

🚩⽇志持久化

以上的⽇志都是输出在控制台上的,然⽽在线上环境中,我们需要把⽇志保存下来,以便出现问题之后追溯问题.把⽇志保存下来就叫持久化.⽇志持久化有两种⽅式

  1. 配置⽇志⽂件名

  2. 配置⽇志的存储⽬录

在这里插入图片描述

配置文件文件名如下:

在这里插入图片描述

后⾯可以跟绝对路径或者相对路径

配置文件的储存目录如下:

logging:file:path: D:/temp

使用该配置,会在该目录下创建一个默认的spring.log的文件储存日志
注意:

  • logging.file.name 和 logging.file.path 两个都配置的情况下,只⽣效其⼀,以logging.file.name 为准

🚩配置⽇志⽂件分割

如果我们的⽇志都放在⼀个⽂件中,随着项⽬的运⾏,⽇志⽂件会越来越⼤,需要对⽇志⽂件进⾏分割.

当然,⽇志框架也帮我们考虑到了这⼀点,所以如果不进⾏配置,就⾛⾃动配置。默认⽇志⽂件超过10M就进⾏分割x

配置项说明默认值
logging.logback.rollingpolicy.file-name-pattern⽇志分割后的⽂件名格式${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.max-file-size⽇志⽂件超过这个⼤⼩就⾃动分割10MB

yml配置如下:

logging:file:name: D:/tmp/springboot.loglogback:rollingpolicy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i

分割结果如下:
在这里插入图片描述

🎋配置⽇志格式

上面所看的配置格式都是默认的。

其实日志格式也是可以配置的。⽀持控制台和⽇志⽂件分别设置

在这里插入图片描述
配置项说明:

  1. %clr(表达式){颜⾊}设置输⼊⽇志的颜⾊⽀持颜⾊有以下⼏种:
    • blue • cyan • faint • green • magenta • red • yellow
  2. %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd’T’HH:mm:ss.SSSXXX}}⽇期和时间–精确到毫秒

%d{}⽇期

${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd’T’HH:mm:ss.SSSXXX}
⾮空表达式,获取系统属性LOG_DATEFORMAT_PATTERN ,若属性LOG_DATEFORMAT_PATTERN 不存在,则使⽤
-yyyy-MM-dd HH:mm:ss.SSSXXX 格式,系统属性可以System.getProperty(“LOG_DATEFORMAT_PATTERN”) 获取

  1. %5p 显⽰⽇志级别ERROR,MARN,INFO,DEBUG,TRACE.

  2. %t 线程名. %c 类的全限定名. %M method. %L 为⾏号.%thread 线程名称. %m 或者 %msg 显⽰输出消息. %n 换⾏符

  3. %5 若字符⻓度⼩于5,则右边⽤空格填充. %-5 若字符⻓度⼩于5,则左边⽤空格填充. %.15 若字符⻓度超过15,截去多余字符.%15.15 若字符⻓度⼩于15,则右边⽤空格填充.若字符⻓度超过15,截去多余字符

更多的说明,点我查看

如果设置了颜色没有显示怎么办呢?

解决方法如下:

  1. 打开启动配置 在这里插入图片描述
  2. 添加VM options 在这里插入图片描述
    在这里插入图片描述
  3. 添加VM options -Dspring.output.ansi.enabled=ALWAYS

在这里插入图片描述

  1. 重新启动程序,就发现控制台⽀持颜⾊了 在这里插入图片描述

🎄更简单的⽇志输出

每次都使⽤LoggerFactory.getLogger(xxx.class)很繁琐,且每个类都添加⼀遍,lombok给我们提供了⼀种更简单的⽅式.

  1. 添加lombok框架⽀持

  2. 使⽤ @slf4j 注解输出⽇志

关于lombok的的使用与安装参考博主在【JavaEEj进阶】 Spring实现留言板中对lombok的使用

lombok提供的 @Slf4j 会帮我们提供⼀个⽇志对象log,我们直接使⽤就可以

在这里插入图片描述

实现代码如下:

@Slf4j
@RestController
public class LogController {@PostConstructpublic void log(){log.info("--------------我是要输出⽇志的内容----------------");}
}

在这里插入图片描述

⭕总结

  1. ⽇志是程序中的重要组成部分,使⽤⽇志可以快速的发现和定位问题,Spring Boot内容了⽇志框架,默认情况下使⽤的是info⽇志级别将⽇志输出到控制台的,我们可以通过lombok提供的@Slf4j 注解和 log 对象快速的打印⾃定义⽇志.
  2. ⽇志包含6个级别,⽇志级别越⾼,收到的⽇志信息也就越少,我们可以通过配置⽇志的保存名称或保存⽬录来将⽇志持久化

关于《【JavaEEj进阶】 Spring实现留言板》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

八股文学习日常第一期(20240121)

零、前言 1、目的 帮助掌握面试题,就八股文相关内容展开进行学习和整理,也方便之后的复习和巩固。 2、八股文内容来源 ①https://blog.csdn.net/w20001118/article/details/125724647 一、具体内容分析 1、类的完整书写方式 1.1、类 [Access Mod…

【Linux对磁盘进行清理、重建、配置文件系统和挂载,进行系统存储管理调整存储结构】

Linux 调整存储结构 前言一、查看磁盘和分区列表二、创建 ext4 文件系统,即:格式化分区为ext4文件系统。1.使用命令 mkfs.ext4 (make file system)报错如下:解决办法1:(经测试,不采用)X解决办法…

vue3源码(一)搭建开发环境

Monorepo:是管理项目代码的一个方式,指在一个项目仓库(repo)中管理多个模块/包(package) vue3源码采用Monorepo管理项目 vue3项目架构 搭建Monorepo环境 1.全局安装pnpm npm install pnpm -g # 全局安装pnpm pnpm init -y # 初始化配置文件创建.npmrc文件&#x…

基于 Redis 实现高性能、低延迟的延时消息的方案演进

🎉欢迎来系统设计专栏:基于 Redis 实现高性能、低延迟的延时消息的方案演进 📜其他专栏:java面试 数据结构 源码解读 故障分析 🎬作者简介:大家好,我是小徐🥇☁️博客首页&#xff1…

C++--入门(命名空间缺省参数函数重载)

目录 0.前言 1. C关键字(C98) 2. 命名空间 3. C输入&输出 4. 缺省(默认)参数 5. 函数重载 6.C支持函数重载的原理--名字修饰(name Mangling) 0.前言 C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题&#xff0c…

I2C接口简介

一、简介 11I2C(Inter-IntegratedCircuit)总线是由PHILIPS公司开发的两线式串行通信总线,使用多主从架构,用于连接微控制器及其外围低速设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形…

了解森林消防灭火泵:为何它是森林安全的关键

在森林火灾中,火势蔓延速度极快,一旦发生火灾,很难及时控制和扑灭。传统的灭火方法主要是利用水扑救,这种方法具有经济、简单、有效等优点。然而,在我国森林火灾中,水资源一直没有得到充分的利用。至今&…

【C++】string的基本使用二

我们接着上一篇的迭代器说起,迭代器不只有正向的,还有反向的,就是我们下边的这两个 它的迭代器类型也是不同的 rbegin就是末尾,rend就是开头,这样我们想遍历一个string对象的话就可以这样做 int main() {string s1(…

CC工具箱使用指南:【检查现状规划用地变化】

一、简介 在规划工作中,有一个普遍性的需求,就是需要检查规划前后在用地上究竟发生了哪些变化。 这一点很重要,不仅是要展示给别人看,自己也要十分注意。 规划方案完成后,一定要进行用地变化的检查,曾经…

从一到无穷大 #21 从基于多数据模型分析负载的Benchmark讨论多模数据库的发展方向

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言M2Bench测试结果从Lindorm看待多模的发展方向总结 引言 《M2Bench: A Database …

VSCode无法下载插件,提示 Error while fetching extensions : XHR failed

解决方案: 打开vscode,依次点击File->Preferences->settings,中文就是文件->首选项->设置,打开如下图: 我们去搜索:Proxy , 然后回车 最重要的一步:将Http Prox…

【GitHub项目推荐--智能家居项目】【转载】

如果你具备硬件、软件知识,这个项目肯定符合你的胃口。 物美智能是一套软硬件结合的开源项目,该系统可助你快速搭建自己的智能家居系统。你可以学习到设备的集成和软硬件交互。 PC 端或者手机与服务端通信,单片机可以接受遥控设备和服务器的…