SpringBoot日志文件

news2024/11/25 7:07:54

文章目录

  • 日志有什么作用?
  • SpringBoot 的日志
  • 日志级别
    • 日志级别的分类
  • 自定义日志
    • 在程序中得到日志对象
    • 使用日志对象打印日志
    • 日志级别设置
    • 日志持久化
  • 更简单的日志输出—lombok

日志有什么作用?

日志是程序的重要组成部分,想象⼀下,如果程序报错了,不让你打开控制台看日志,那么你能找到报错的原因吗?

答案是否定的,写程序不是买彩票,不能完全靠猜,因此日志对于我们来说,最主要的用途就是排除和定位问题。

除了发现和定位问题之外,我们还可以通过日志实现以下功能:

  • 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户
  • 记录系统的操作日志,方便数据恢复和定位操作人
  • 记录程序的执行时间,方便为以后优化程序提供数据支持

以上这些都是日志提供的非常实用的功能

SpringBoot 的日志

Spring Boot 项目在启动的时候默认就有日志输出,如下图所示:

在这里插入图片描述

以上内容就是 Spring Boot 输出的控制台日志信息。
通过上述日志信息我们能发现以下4个问题:

  1. Spring Boot 内置了日志框架(不然也输出不了日志)
  2. 打印的日志不仅有时间,还有日志等级,线程id以及日志信息来自哪个类
  3. 默认情况下,输出的日志并非是开发者定义和打印的,那开发者怎么在程序中自定义打印日志呢?
  4. 日志默认是打印在控制台上的,而控制台的日志是不能被保存的,那么怎么把日志永久的保存下来呢?

日志级别

日志的级别就是为了筛选符合目标的日志信息的。试想⼀下这样的场景,假设你⼀家 2 万⼈公司的⽼板,那么每⼈员工的日常工作和琐碎的信息都要反馈给你吗?⼀定不会,因为你根本没有那么多经历。于是就有了组织架构,而组织架构就会分级,有很多的级别设置,如下图所示:

在这里插入图片描述
有了组织架构之后,就可以逐级别汇报消息了,例如:组员汇报给组长;组长汇报给研发⼀组;研发一组汇报给 Java 研发,等等依次进行汇报

而日志分级大概的道理也是⼀样的,有了日志级别之后就可以过滤自己想看到的信息了,比如设置日志级别为 error,那么就可以只看程序的报错日志了,对于普通的调试日志和业务日志就可以忽略了,从而节省开发者的信息筛选时间

日志级别的分类

日志的级别分为:

  1. trace:微量,少许的意思,级别最低
  2. info:普通的打印信息
  3. debug:需要调试时候的关键信息打印
  4. warn:警告,不影响使⽤,但需要注意的问题
  5. error:错误信息,级别较⾼的错误日志信息
  6. fatal:致命的,因为代码异常导致程序退出执行的事件

日志级别的顺序:

在这里插入图片描述

越往上接收到的消息就越少

自定义日志

开发者自定义打印日志的实现步骤:

  1. 在程序中得到日志对象
  2. 使用日志对象的相关语法输出要打印的内容

在程序中得到日志对象

在程序中获取日志对象需要使用日志工厂 LoggerFactory,如下代码所示:

先得到日志对象(来自slf4j)
private final static Logger log =
    LoggerFactory.getLogger(UserController.class);//设置当前类的类型,打印日志的时候,就会把类信息带上

日志工厂需要将每个类的类型传递进去,这样我们才知道日志的归属类,才能更方便、更直观的定位到问题类

注意:Logger 对象是属于 org.slf4j 包下的,不要导入错包

在这里插入图片描述

因为 Spring Boot 中内置了日志框架 Slf4j,所以咱们可以直接在程序中调用 slf4j 来输出日志

使用日志对象打印日志

将所有级别的日志都打印一遍:

@Controller
@ResponseBody
public class UserController {

    //1.先得到日志对象(来自slf4j)
    private final static Logger log =
            LoggerFactory.getLogger(UserController.class);//设置当前类的类型,打印日志的时候,就会把类信息带上

    @RequestMapping("/sayhi") //设置路由
    public void sayHi() {
        log.trace("我是 trace");
        log.debug("我是 debug");
        //上述两个日志信息,控制台看不到,因为只能看到日志等级>=info的日志
        log.info("我是 info");
        log.warn("我是 warn");
        log.error("我是 error");
    }
}

在这里插入图片描述

结果我们发现 trace 和 debug 的日志信息并没有被打印,这是为什么呢?
这就是日志级别的问题了,SpringBoot的默认日志级别是 info,也就是说只有日志级别大于等于 info 的才会被输出,否则将会被过滤掉,后面将讲到如何设置日志级别

除此之外,我们并没有写 log.fatal(“我是 fatal”)
实际上,slf4j 的日志方法中,并没有这个方法,因为该日志级别是系统输出的日志,不能自定义打印

在获取日志对象时,如果不填写当前类(不设置参数),那么结果会是怎么样呢?

private final static Logger log = LoggerFactory.getLogger("");

在这里插入图片描述

结果并没有当前类的信息,因此我们在获取日志对象时,一定要填写当前类,否则在查看日志信息时,就不知道是哪个类打印的

日志级别设置

日志级别配置只需要在配置文件(.properties 或者 .yml)中设置“logging.level”配置项即可

例如,将全局的日志级别设置为 trace:

# 设置全局的日志级别为trace
logging.level.root=trace

在这里插入图片描述

此时 trace 和 debug 级别的日志都将被打印,说明全局日志配置已经成功

如果同时设置全局日志级别和局部日志级别时,那么最终的日志级别以局部为主,也就是说局部日志级别优先级 > 全局日志级别,例如:

# 设置全局的日志级别为trace
logging.level.root=trace
# 设置局部文件夹的日志级别
logging.level.com.example.demo=trace

在这里插入图片描述

日志持久化

之前的日志信息都是稍纵即逝的,每次重新启动 SpringBoot 项目时,上一次在控制台显示的日志信息将全部失去,这种情况在生产环境是不允许的。在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志永久的保存到磁盘的某个位置的过程就叫做持久化。

想要将日志进行持久化,只需要在配置⽂件中指定日志的存储目录或者是指定日志保存文件名之后,
Spring Boot 就会将控制台的日志写到相应的目录或文件下了。

配置日志文件的保存路径:

# 配置⽇志⽂件的⽬录
logging.file.path= B:\\javatestdemo\\SpringBoot-2
# 单个反斜杠会存在转义,所以要写两个反斜杠
# 除此之外,还能写成Linux下的斜杠路径分隔符
# logging.file.path=B:/javatestdemo/SpringBoot-2

在这里插入图片描述
spring.log是默认的名字

配置日志文件的文件名:

# 配置日志文件的文件名
logging.file.name=B:\\javatestdemo\\SpringBoot-2\\SpringBoot.log
# 单个反斜杠会存在转义,所以要写两个反斜杠
# 除此之外,还能写成Linux下的斜杠路径分隔符
# logging.file.name=B:/javatestdemo/SpringBoot-2/SpringBoot.log

在这里插入图片描述

通常情况下,无论是哪种方式,我们都是指定绝对路径,而不是相对路径
通常情况下,日志的默认情况下是进行追加,而不是覆盖

设置日志的大小:

logging.logback.rollingpolicy.max-file-size=10MB

在这里插入图片描述

日志的默认大小就是10MB。日志不能太大,如果几个GB,堪比一场超清电影,难以查看。日志太小也会导致有大量的日志文件,难以查看

更简单的日志输出—lombok

每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦,因此 lombok 给我们提供了更简单,更好用的日志输出方式。

使用之前必须将 lombok 添加到当前项目

添加 @slf4j 注解即可,其他写法都一样

@Slf4j
@Controller
@ResponseBody
public class UserController {
    @RequestMapping("/sayhi") //设置路由
    public void sayHi() {
        log.trace("我是 trace");
        log.debug("我是 debug");
        //上述两个日志信息,控制台看不到,因为只能看到日志等级>=info的日志
        log.info("我是 info");
        log.warn("我是 warn");
        log.error("我是 error");
    }
}

日志打印结果:

在这里插入图片描述

为什么我们加了注解之后就能实现这样一个功能呢?

lombok原理

lombok 能够打印日志的密码就在 target 目录里面,target 为项目最终执行的代码,查看 target 目录如
下:

在这里插入图片描述

JVM能识别的是字节码文件,而非源代码,看一下 UserController 的源代码:

在这里插入图片描述

在这个字节码文件中,并没有 @slf4j,却多了一条获取日志对象的代码,原因就是源代码进行编译成字节码文件时,会将对应的注解替换成对应的代码

Lombok 的作用如下图所示:

在这里插入图片描述

lombok 更多注解说明

基本注解

注解作用
@Getter自动添加 getter 方法
@Setter自动添加 setter 方法
@ToString自动添加 toString 方法
@EqualsAndHashCode自动添加 equals 和 hashCode 方法
@NoArgsConstructor自动添加无参构造方法
@AllArgsConstructor自动添加全属性构造方法,顺序按照属性的定义顺序
@NonNull属性不能为 null
@RequiredArgsConstructor自动添加必需属性的构造方法,final + @NonNull 的属性为必需

组合注解

注解作用
@Data@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor

日志注解

注解作用
@Slf4j添加⼀个名为 log 的日志,使用 slf4j

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

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

相关文章

Android 导航之Navigation 组件的介绍与使用

1、介绍: 在以前的应用中,针对多导航模块的使用,常见的有tabhost或者FragmentTabHost,但是这些在使用的过程中,非常臃肿,包括加载和管理也不如人意。在AndroidX中,官方引入Navigation模块&#…

【信管2.4】项目运行环境与项目经理

项目运行环境与项目经理加餐加餐来了哦,今天的内容在 《信息系统项目管理师教程》 这本教材里是没有的,而且在 PMBOK 第五版中也是没有的。这部分内容是 PMBOK 第六版中新加的两个独立章节,不过内容不多,非常轻松,重点…

AGV移动机器人无人叉车控制器设计

AGV控制器是为移动机器人(AMR、智能叉车等)设计的通用控制器,为移动机器人提供地图构建、定位导航、模型编辑等核心功能。 本方案将移动机器人的核心组件集成于一体,配合功能强大的客户端软件 ,可帮助用户快速实现机器…

【数据结构】Java实现数据结构的前置知识,时间复杂度空间复杂度,泛型类的讲解

文章目录数据结构时间复杂度、空间复杂度包装类、装箱与拆箱泛型擦除机制数据结构 当我们在成为一名程序员的这条道路上努力的时候,我们一定经常听到这个词数据结构。那么究竟什么是数据结构呢?数据结构顾名思义,就是数据结构,数…

[附源码]计算机毕业设计JAVA校园快递管理系统

[附源码]计算机毕业设计JAVA校园快递管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

vtkjs中Sample Distance功能

通过 SetSampleDistance () 来设置每条射线的采样步长,默认值为1,单位为世界坐标系单位,数值越小越精细 通过 SetImageSampleDistance () 来设置图像采样距离,默认值为1,即投射光线的间隔数值越小越精细 核心代码如下…

【OpenCV-Python】教程:3-10 直方图(2)直方图均衡

OpenCV Python 直方图均衡化 【目标】 理解直方图均衡化提升图像的对比度 Histogram Equalization ??? 将图像的直方图拉均衡一些,分散一些;可以提升对比度。 【代码】 通过上面的图像可以看出,高亮度区域较少,需要分散该图像…

Java HashMap 的扩容因子为什么是 0.75

所谓的加载因子,也叫扩容因子或者负载因子,它是用来进行扩容判断的。 假设加载因子是0.5,HashMap初始化容量是16,当HashMap中有16 * 0.58个元素时,HashMap就会进行扩容操作。 而HashMap中加载因子为0.75,…

pandas 100题

文章目录1.将下面字典创建为DataFrame2.提取含有字符串“python”的行3.输出df所有列名4.修改第列名5.统计grame列中每种编程语言出现的次数6 将空值用上下值的平均值填充7 列值大于3的数8 去重列9 计算列平均值10 将列转换列表11 保存到excel12 查询行列13 列值大于3小月7的值…

【Spring】编程式事务的应用场景理解

前言 我们经常在使用Spring全家桶开发JavaEE项目的时候,一想到事务就会习惯性的使用声明式注解Transactional,由Spring框架帮你做AOP实现事务的回滚,但是声明式事务恰恰比较方便,所以有些场景下并不好用,接下来我来举一个例子&am…

服务器下载mmdetection

1.申请账号密码 找实验室有root权限的同学创建一个账号密码 2.命令行中敲:ssh服务器账号,然后输入自己的服务器密码(确认自己是否处于校园网环境,如果不在的话记得连vpn) 3.命令行敲cd /切换到根目录然后ls查看服务…

通过SCADA实现KPI分析和预测性维护远比想象中简单

一、前言 随着工业发展的不断进步,越来越多的企业开始注重KPI分析和预测性维护。通过数据分析实现智能制造已经成为不可缺少的环节。制定并分析关键绩效指标(KPI)是实现数据分析战略的重要一步,因为只有跟踪这些关键绩效指标才能…

题目1444:蓝桥杯201 4年第五届真题斐波那契

这篇文章是帮一个叫做【废柴成长中】的孩子写的。 题目&#xff1a; 这里难点应该就是在【输入为一行用空格分开的整数n m p(0<n,m&#xff0c;p<10^18)】 &#xff0c;这里一下子就把最大值干成long的最大范围了&#xff0c;很明显&#xff0c;long肯定也不行。 解析其…

[附源码]计算机毕业设计JAVA闲置物品线上交易系统

[附源码]计算机毕业设计JAVA闲置物品线上交易系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

区块链工作原理(节点、层)

Users/Nodes in a Blockchain Network 在某个节点被当作区块链网络的一部分之前&#xff0c;它必须要完成以下的要求&#xff1a; 节点需要为认证过程生成公钥/私钥对节点需要与区块链网络中的其他一部分节点建立直接连接&#xff08;peer connection&#xff09;&#xff0c…

KVM虚拟机迁移

一、KVM宿主机高可用架构设计 宿主机故障&#xff0c;内部虚拟机可以不受影响&#xff0c;可以迁移走负载均衡&#xff0c;当某个宿主机压力过大&#xff0c;可以将部分虚拟机迁移到其他机器&#xff0c;降低其负载。 1.1、架构设计 1.2、实验机器 机器 IP 角色 node1 192.…

L. Paid Leave(贪心)[CCPC Finals 2021]

题目如下&#xff1a; 思路 or 题解 我们可以先只考虑第一段(两个休息日之间) 白色为休息日&#xff0c;蓝色为工作日 我们思考&#xff0c;如果在满足题意的条件下&#xff0c;如何安排额外的休息日可以使答案更优&#xff1a; 贪心可得&#xff1a;额外的休息日尽量往后安排…

RabbitMQ之TTL机制

在京东下单&#xff0c;订单创建成功&#xff0c;等待支付&#xff0c;一般会给30分钟的时间&#xff0c;开始倒计时。如果在这段时间内用户没有支付&#xff0c;则默认订单取消。 该如何实现&#xff1f; 定期轮询&#xff08;数据库等&#xff09; 用户下单成功&#xff0…

【自然语言处理(NLP)】聊天机器人模块实现

【自然语言处理&#xff08;NLP&#xff09;】聊天机器人模块实现 作者简介&#xff1a;在校大学生一枚&#xff0c;华为云享专家&#xff0c;阿里云专家博主&#xff0c;腾云先锋&#xff08;TDP&#xff09;成员&#xff0c;云曦智划项目总负责人&#xff0c;全国高等学校计算…

《异常检测——从经典算法到深度学习》20 HotSpot:多维特征 Additive KPI 的异常定位

《异常检测——从经典算法到深度学习》 0 概论 1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法 3 基于One-Class SVM的异常检测算法 4 基于高斯概率密度异常检测算法 5 Opprentice——异常检测经典算法最终篇 6 基于重构概率的 VAE 异常检测 7 基于条件VAE异常…