【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.rhkb.cn/news/243176.html

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

相关文章

QQ数据包解密

Windows版qq数据包格式&#xff1a; android版qq数据包格式&#xff1a; 密钥&#xff1a;16个0 算法&#xff1a;tea_crypt算法 pc版qq 0825数据包解密源码&#xff1a; #include "qq.h" #include "qqcrypt.h" #include <WinSock2.h> #include…

Win10下在Qt项目中配置SQlite3环境

资源下载 官网资源&#xff1a;SQLite Download Page 1、sqlite.h sqlite-amalgamation-3450000.zip (2.60 MiB) 2、sqlite3.def&#xff0c;sqlite3.dll sqlite-dll-win-x64-3450000.zip (1.25 MiB) 3、 win10下安装sqlite3所需要文件 sqlite-tools-win-x64-3450000.zipht…

node介绍

1.node是什么 Node是一个基于Chrome V8引擎的JS运行环境。 Node不是一个独立的语言、node不是JS框架。 Node是一个除了浏览器之外的、可以让JS运行的环境 Node.js是一个让JS运行在服务端的开发平台&#xff0c;是使用事件驱动&#xff0c;异步非阻塞I/O&#xff0c;单线程&…

fastJson和jackson的日期数据处理

目录 1.jackson 2.fastjson 3.总结 1.jackson jackson是spring mvc默认的JSON解析方法&#xff0c;前端的数据序列化处理之后&#xff0c;后端经过反序列化处理可以直接使用实体对象进行接收。后端接口返回实体对象&#xff0c;经过序列化处理后前端可以接收并进行处理。 …

回归预测 | Matlab基于ABC-SVR人工蜂群算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于ABC-SVR人工蜂群算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于ABC-SVR人工蜂群算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于ABC-SVR人工蜂群算法优化支持…

C++提高编程---模板---类模板

目录 一、类模板 1.模板 2.类模板的作用 3.语法 4.声明 二、类模板和函数模板的区别 三、类模板中成员函数的创建时机 四、类模板对象做函数参数 五、类模板与继承 六、类模板成员函数类外实现 七、类模板分文件编写 八、类模板与友元 九、类模板案例 一、类模板 …

第14章_集合与数据结构拓展练习(前序、中序、后序遍历,线性结构,单向链表构建,单向链表及其反转,字符串压缩)

文章目录 第14章_集合与数据结构拓展练习选择填空题1、前序、中序、后序遍历2、线性结构3、其它 编程题4、单向链表构建5、单向链表及其反转6、字符串压缩 第14章_集合与数据结构拓展练习 选择填空题 1、前序、中序、后序遍历 分析&#xff1a; 完全二叉树&#xff1a; 叶结点…

ElasticSearch的常用增删改查DSL和代码

es增删改查常用语法 我们日常开发中&#xff0c;操作数据库写sql倒是不可能忘记&#xff0c;但是操作es的dsl语句有时候很容易忘记&#xff0c;特地记录一下方便查找。 DSL语句 1、创建索引 -- 创建索引 PUT /my_index {"mappings": {"properties": {&…

Python实现Lasso回归模型

• Tibshirani(1996)提出了Lasso(The Least Absolute Shrinkage and Selectionator operator)算法。 • 通过构造一个一阶惩罚函数获得一个精炼的模型&#xff1b;通过最终确定一些指标&#xff08;变量&#xff09;的系数为零&#xff08;岭回归估计系数等于0的机会微乎其微&a…

【HarmonyOS】体验鸿蒙电商平台的未来之旅!

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

【堂堂狼人杀(定制开发)】

堂堂狼人杀游戏♨️风险规避与优势。?零投资也可参与规避五大风险 政策风险(点对点场外交易)账户风险(无资金池&#xff09; 推广风险(免费注册&#xff0c;注册送大礼包&#xff09; 网络风险(大平台&#xff0c;全网场外交易) 人脉风险(预约角色&#xff0c;强制出售) …

力扣hot100 相交链表 超全注释 满级表达

Problem: 160. 相交链表 文章目录 思路复杂度&#x1f496; Ac Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f469;‍&#x1f3eb; 参考图解 复杂度 时间复杂度: O ( n m ) O(nm) O(nm) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( 1 ) O(1) O(…

python 正则表达式学习(1)

正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 1. 特殊符号 1.1 符号含义 模式描述^匹配字符串的开头$匹配字符串的末尾.匹配任意字符&#xff0c;除了换行符&#xff0c;当re.DOTALL标记被指定时&#xff0c;则可以匹配包…

飞书+ChatGPT+cpolar搭建企业智能AI助手并实现无公网ip远程访问

文章目录 推荐 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂…

用pandas实现用前一行的excel的值填充后一行

今天接到一份数据需要分析&#xff0c;数据在一个excel文件里&#xff0c;内容大概形式如下&#xff1a; 后面空的格子里的值就是默认是前面的非空的值&#xff0c;由于数据分析的需要需要对重复的数据进行去重&#xff0c;去重就需要把控的cell的值补上&#xff0c;然后根据几…

数字IC后端设计实现 | PR工具中到底应该如何控制density和congestion?(ICC2Innovus)

吾爱IC社区星友提问&#xff1a;请教星主和各位大佬&#xff0c;对于一个模块如果不加干预工具会让inst挤成一团&#xff0c;后面eco修时序就没有空间了。如果全都加instPadding会导致面积不够overlap&#xff0c;大家一般怎么处理这种问题&#xff1f; 在数字IC后端设计实现中…

Python内置的20个高阶函数的功能和示例详解

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python是一门功能丰富的编程语言&#xff0c;提供了许多内置函数来处理各种数据操作。其中&#xff0c;高阶函数是一类特殊的函数&#xff0c;它们接受其他函数作为参数&#xff0c;或者返回函数作为结果。高阶函…

如何禁用WordPress站点的管理员电子邮件验证或修改检查频率?

今天boke112百科登录某个WordPress站点时&#xff0c;又出现“管理员邮件确认”的提示&#xff0c;要求确认此站点的管理员电子邮箱地址是否仍然正确。具体如下图所示&#xff1a; 如果点击“稍后提醒我”&#xff0c;那么管理员邮件验证页面就会在3天后重新显示。 说实话&…

Unity - 简单音频

“Test_04” AudioTest public class AudioTest : MonoBehaviour {// 声明音频// AudioClippublic AudioClip music;public AudioClip se;// 声明播放器组件private AudioSource player;void Start(){// 获取播放器组件player GetComponent<AudioSource>();// 赋值…

搭建开源数据库中间件MyCat2-配置mysql数据库双主双从

mycat2官网&#xff1a;MyCat2 前言&#xff1a;mycat2下载地址无法访问&#xff0c;不知道是不是被DNS污染了&#xff0c;还是需要搭梯子访问&#xff0c;所以我只能找到1.21的版本进行安装。搭建mycat2的前提是搭建数据库主从复制。 架构&#xff1a;双主双从 配置&#xf…