Java EE 突击 9 - Spring Boot 日志文件

news2024/10/6 8:36:23

Spring Boot 日志文件

  • 学习目标
  • 一 . 日志有什么用
    • 1.1 日志格式说明
  • 二 . 自定义日志打印
    • 2.1 得到日志对象
    • 2.2 使用日志对象提供的方法 , 输出自定义的日志内容
    • 2.3 日志的级别
  • 三 . 日志持久化
    • 3.1 在配置文件里面设置日志名称
    • 3.2 设置日志的保存目录
  • 四 . 日志级别的设置
  • 五 . 简化日志的小技巧 - lombok
    • 5.1 lombok 的使用
    • 5.2 lombok 的原理
    • 5.3 lombok 更多注解说明
  • 总结

这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架
JavaEE 进阶专栏

Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在

接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点

并且带领大家进行环境的配置 , 让大家真正用好框架、学懂框架

来上一篇文章复习一下吧
点击即可跳转到我的小秘密
在这里插入图片描述

学习目标

  1. 输出自定义日志信息
  2. 将日志持久化
  3. 通过设置日志的级别来筛选和控制日志的内容

一 . 日志有什么用

日志只有一个作用 : 发现问题 定位问题
我们之前已经使用了很多次的日志
image.png
除了发现和定位问题之外,我们还可以通过日志实现以下功能:

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

1.1 日志格式说明

image.png
日志打印级别 : 用来筛选有效信息

在日常调试和开发过程中 , 我们需要看的日志通常会比较多 , 在生产环境的时候 , 我们并不需要看调试日志以及开发日志 , 我们就可以把他屏蔽掉 , 也可以把 Spring Boot 展示给我们的日志(INFO) 也关闭掉 , 只展示报错以及警告信息 , 那么我们就可以通过日志的级别来进行筛选关键信息 . 而且打印日志也是会消耗一定资源的 , 所以在线上环境就尽量别弄出什么幺蛾子了 .

通过目前我们了解到的日志 , 我们发现三个问题 :

  1. 这是 Spring Boot 默认的日志格式 , 目前我们打印出的都是系统自己的日志 , 那么我们怎么样能让控制台打印我们自己的日志 ?
  2. 我们的日志是保存在我们的内存上的 , 那么假如我们的线上环境出现了问题 , 我们也不能说让人一直去看着 , 出现问题赶紧把开发人员叫过来查看日志 , 所以日志的持久化保存也是非常有必要的
  3. 我们需要通过日志的级别来筛选我们需要的信息

二 . 自定义日志打印

自定义日止的实现步骤 :

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

我们思考一个问题 : 使用 sout 语句能否替代日志呢 ?
TestController.java

package com.example.demo.aa.bb;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// 这个注解什么意思先不用管
@RestController
public class TestController {

    // 这个注解什么意思先不用管
    @RequestMapping("/sayhi")
    public String sayHi() {
        System.out.println("这里正在测试日志");
        return "日志";
    }
}

我们这不也打印出相关信息了吗 ?
image.png
但是感觉跟正常的日志差得有点多 , 感觉不太靠谱

  1. 只有打印的内容 , 没有其他的相关信息 , 比如打印的时间、打印的类(出处)
  2. 不能实现不同环境下的行为控制

比如我们的日志能够通过日志级别筛选 , 让线上环境或者开发环境展示出不同的信息 , 而 sout 语句不行 , 他会在哪里都打印的

所以使用 sout 语句是不能替代日志的 , 还是需要专业的人干专业的事的

2.1 得到日志对象

导入 Logger 对象
注意 : 一定要选择 org.slf4j (飒楼否四节)
然后使用 Logger 的 LoggerFactory 里面的 getLogger 方法, 参数填写当前类.class
image.png
image.png
image.png

2.2 使用日志对象提供的方法 , 输出自定义的日志内容

使用 log. 的方式 , 接下来我们就可以打印日志了

package com.example.demo.aa.bb;

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 TestController {
    // 1. 得到日志对象
    private static Logger log = LoggerFactory.getLogger(TestController.class);

    @RequestMapping("/sayhi")
    public String sayHi() {
        // 2. 打印日志
        log.info("Hi,Spring Boot Log.");//使用日志对象的方法输出日志
        return "日志";
    }
}

image.png
那么我们上面告诉大家一定要用 slf4j , 那么 slf4j 是个什么东西 ?
我们的 slf4j 与 Spring Boot 是密切相关的 , slf4j 也是目前行业中的日志标杆了 , 他的日志以我们目前对于 Spring Boot 的理解来说 , 还算是比较复杂的 . 但看似很简单的日志 , 其实是由两部分实现的
image.png
我们可以这样理解 : 日志门面就是前端 , 日志实现就是后端
为什么一个简简单单的日志还要分解为日志门面还有日志实现呢 ?
最刚开始 , 其实日志是不分类的 , 后来发现了一个问题 : 我们的代码通用性问题 , 假如我们最开始用 log4j 1/2 , 但是后来他就出现漏洞了 , 所以大家又转战到了 logback , 但是使用 logback 就出现了问题 : 我们之前所有调用日志代码的地方就需要去更改 , 这样日志就没有通用性了 , 所以我们就再抽象一层 , 我们是从 slf4j 使用的 , slf4j 会自己帮我们解决好适配性问题 , 提高代码的移植性
其实和我们 JDBC 的问题是一样的 , 大家都是为了能够提高代码的通用性

2.3 日志的级别

我们不光可以打印普通日志 , 还可以打印其他等级的日志

package com.example.demo.aa.bb;

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 TestController {
    // 1. 得到日志对象
    private static Logger log = LoggerFactory.getLogger(TestController.class);

    @RequestMapping("/sayhi")
    public String sayHi() {
        // 2. 打印日志
        // 级别从上到下逐个提升的
        log.trace("Hi,I am trace.");//痕迹日志
        log.debug("Hi,I am debug.");//调试日志
        log.info("Hi,I am info.");//普通日志
        log.warn("Hi,I am warn.");//警告日志
        log.error("Hi,I am error");//报错
        return "日志";
    }
}

image.png
那为什么剩下两个没被打印呢 ?
这是因为默认情况下日志级别是 info , 所以就把 trace debug 筛选下去了
那么我们都有哪些级别的日志呢 ?
image.png

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

那么我们上面只打印出来五种啊 , 咋没打印第六种 .
image.png
可以看到 , 我们是调用不出来 fatal 的 . 这种致命的错误不是你说调就调出来的 , 当发生异常情况导致终止的时候才能看到 fatal , 甚至说严重点 , 还没有多少人见过他的芳容 .

三 . 日志持久化

3.1 在配置文件里面设置日志名称

我们在 application.yml 里面添加这句配置项

# 设置日志文件的文件名
logging:
  file:
    name: springboot.log

接下来运行查看一下效果
image.png
还可以这样去看
image.png
image.png
image.png
如果有的同学没看见日志在哪里 , 可以把 target 文件夹删除 , 重新运行再来看
image.png
接下来 , 我们就可以把项目停掉 , 来看一下咱们的日志
image.png
那么我们重新运行 , 新的日志是追加在后面还是覆盖掉 ?
肯定是追加在后面 , 不然还是有日志丢失的风险 .
重新运行后的日志就变多了
image.png
那么日志一直追加 , 越来越大 , 打开的速度就会变得非常慢 , 寻找日志就比较麻烦 , 那怎么办呢 ?
当日志比较大的时候 , 会自动分割成多个文件 , 所以不用去担心

3.2 设置日志的保存目录

# 设置日志文件的目录
logging:
  file:
    path: D:\study\JavaCode

我们打开这个目录看一下是否真的生成了 ?
image.png
那么我们把程序停止 , 看看日志里面有什么 ?
image.png
那么这种方式能不能追加日志呢 ?
也是可以追加的
image.png

四 . 日志级别的设置

日志级别的设置非常的精细化 , 可以针对于某个目录设置日志级别 , 还可以设置一个全局的日志级别
日志级别配置只需要在配置文件中设置 “logging level” 配置项即可

logging:
  level:
    root: debug

image.png
注意 : 我们之前写过 logging , 要是再写一个 logging 的话就会报错
image.png
所以我们可以在一个 logging 标签底下写多个配置项

logging:
  file:
    path: D:\study\JavaCode
  level:
    root: warn # 根路径

那么有的人只想看到自己的 DEBUG 日志 , 不想看到 Spring 的 DEBUG 日志 , 因为 Spring 的 DEBUG 日志实在是太多了 , 那么我们就可以把系统日志设置的级别高一些 , 可以让 Spring 的日志级别设置成 warn , 我们自己的代码的日志级别设置成 debug

logging:
  file:
    path: D:\study\JavaCode
  level:
    root: warn # 根路径
    com:
      example:
        demo: debug # com.example.demo 下面的所有类,日志级别都是 debug

image.png
那么我们想要自己的日志级别为 trace , 系统日志为 warn 怎么处理呢 , 同样很简单

logging:
  file:
    path: D:\study\JavaCode
  level:
    root: warn # 根路径
    com:
      example:
        demo: trace

image.png


接下来 , 我们模拟一下真实的开发环境
上节课我们学过多平台的配置文件设置 , 那么我们就可以根据不同的环境打印出不同等级的日志了
首先 , 我们创建出三个不同的环境的配置文件

开发环境的配置文件 : application-dev.yml
测试环境的配置文件 : application-test.yml
生产环境的配置文件 : application-prod.yml

然后我们分别在每个配置文件中设置不一样的端口 , 方便我们后续测试效果
image.png
然后接下来设置每个环境的日志等级
开发环境设置成系统日志为 warn , 自己的日志为 debug
测试环境设置成系统日志为 warn , 自己的日志为 info
生产环境设置成系统日志为 warn , 自己的日志为 warn
image.png
接下来在我们总的配置文件中调用每个单独的配置文件

# 运行环境设置
spring:
  profiles:
    active: dev

记得这里要去浏览器访问 127.0.0.1:8888/sayhi, 因为我们的开发环境配置文件端口号是 8888
image.png
这次访问 127.0.0.1:9999/sayhi

# 运行环境设置
spring:
  profiles:
    active: test

image.png
这次访问 127.0.0.1:11111/sayhi

# 运行环境设置
spring:
  profiles:
    active: prod

image.png

五 . 简化日志的小技巧 - lombok

我们在 com.example.demo 包底下新建一个 StudentController 类
然后编写代码

package com.example.demo;

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 StudentController {
    // 1. 得到日志对象
    private static Logger logger = LoggerFactory.getLogger(StudentController.class);

    @RequestMapping("/hi")
    public String sayHi() {
        // 2. 使用日志对象提供的方法进行日志打印
        logger.trace("Hi,I am trace.");
        logger.debug("Hi,I am debug.");
        return "Hi,Spring Boot.";
    }
}

image.png
但是每次这样写 , 我们还觉得怪麻烦的
那我们的 Spring Boot 还是可以解决这个问题的
这就需要我们使用额外的库 - lombok
我们之前不想写 Getter Setter 方法 , 只要在上面加上 @Getter @Setter 注解 , 甚至直接加一个 @Data 注解即可
等到日志这里 , 我们发现唯一不同的 ,就是图片里圈出来那部分 , lombok 发现了 , 只有类型不同 , 那么我们只需要拿到当前类的类型呗 , 那我就通过一个注解帮你完成 , 注解内部就是我们图片里的这句代码 , lombok 自动帮我们获取类型了
那怎么使用 lombok 来更简单的输出呢 ?

5.1 lombok 的使用

  1. 添加 lombok 框架支持。
  2. 使用 @slf4j 注解输出日志。
package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// 1. 引入 lombok 依赖
@Slf4j
@RestController
public class StudentController {

    @RequestMapping("/hi")
    public String sayHi() {
        // 2. 使用日志对象提供的方法进行日志打印
        log.debug("Hi,I am debug.");
        return "Hi,Spring Boot.";
    }
}

image.png


有的同学可能调用不出来 lombok , 比如这样
image.png
只需要添加 lombok 的依赖即可
右键 -> Generate
image.png
选择 Dependency
image.png
搜索 lombok , 选择第二个
image.png
这样 lombok 依赖就自己添加进去了
前提是 IDEA 版本是 2021.3.2+ , 其他版本我们也可以选择装一个插件 : EditStarters 实现依赖引入
image.png
image.png
image.png
这个页面似曾相识
image.png
这样依赖就添加进去了 , 记得手动刷新一下

5.2 lombok 的原理

image.png
image.png
image.png
image.png
image.png
image.png
image.png
实际上 , 原理就是这样
image.png
lombok 在编译期间就开始干活了 , 这样对于 JVM 来说是感知不到的 , 他就知道我们传过来的代码里面已经有日志对象了

5.3 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

总结

日志是程序中的重要组成部分,试用日志可以快速的发现和定位问题,Spring Boot 提供了日志框架 , 默认情况下使用的是 info 日志级别将日志输出到控制台的,我们可以通过 lombok 提供的 @Slf4j 注解和 log 对象快速的打印自定义日志,⽇日志包含 6 个级别:

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

日志级别依次提升 , 而日志级别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志永久地保存下来。


至此 , Spring Boot 的日志文件就分享完毕 , 给个三连来救救小猫
在这里插入图片描述

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

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

相关文章

【Linux 网络】NAT技术——缓解IPv4地址不足

NAT技术 NAT 技术背景NAT IP转换过程NAPTNAT 技术的缺陷 NAT(Network Address Translation,网络地址转换)技术,是解决IP地址不足的主要手段,并且能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算…

爬虫程序中使用爬虫ip的优势

作为一名爬虫技术员,我发现在爬虫程序中使用代理IP可以提升爬取效率和匿名性。今天,我就来详细讲解一下代理IP在爬虫程序中的工作原理及应用。 首先,我们来了解一下代理IP在爬虫程序中的工作原理。当我们使用爬虫程序进行数据采集时&#xf…

【雕爷学编程】Arduino动手做(200)---WS2812B幻彩LED灯带

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

Android 开发者选项日志存储路径

android开发者选项中存在两个item是关于系统日志的。 1.日志记录器缓冲区大小 2.在设备上永久存储日志记录器数据 一个是用来设置缓冲区大小,一个是用来日志存储开关及过滤。 通过分析 system/core/logcat/logcatd.rc mkdir /data/misc/logd 0770 logd log 日志的…

AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门)

AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门) 1. 前言2. 关于 Amazon S32.1 介绍2.1.1 简述2.1.2 详细介绍 2.2 Amazon S3 好处和功能2.3 3. 创建S3存储桶3.1 创建存储桶3.2 修改访问权限 4. 简单实用4.1 上传图片文件4.2…

keil5 watch数据一直为0不显示

调试遇到一个问题,以为是指针里面的数据,数组显示不出来,结果是main函数里面有个1s的延时,我的理解是watch刷新太慢了,一直掉进延时里面,所以我们把延时改到10ms就行了。

100ASK百问网 全志D1s/T113-s3开发板 适配ov5640教程

本实验采用百问网的100ASK_T113-PRO Base V1.1 , D1s也可以参考进行修改并适配。 本实验所需的文件(含tina根文件系统、SD镜像、设备树、内核配置文件)供大家对比参考:source.zip 1.硬件配置 查看百问网提供的T113开发板原理图1…

Vue2核心完整笔记

文章目录 [TOC](文章目录)前言1. vue2基础知识和原理1.1 初识Vue 和 Vue简介1.2 模板语法1.3 数据绑定1.4 el与data的两种写法1.5 Vue中的MVVM1.6 数据代理1.7 事件处理1.8 键盘事件1.9 计算属性1.10 监视属性1.11 绑定样式class样式style样式 1.12 条件渲染v-ifv-show 1.13 列…

echarts 图表饼状图 实例

效果图: 代码: draw(data1, data2) {var option {// backgroundColor: rgb(10,36,68),color: [#F19611 ,#0095FE,#162D86,#0096FF,#05F8FF,#FFD985,#FACDAA,#F4A49E,#EE7B91,#E85285,#BE408C,#942D93,#171E6D,#1E3388,#27539B,#3073AE,#3993C2,#42B3D…

比较IP代理与路由器获取IP地址的三大差异

在今天的文章中,我们将与大家一起探讨IP代理与路由器获取IP地址的差异。这两种方式在获取IP地址上有一些区别,而这些区别会对我们的网络使用体验产生影响。今天我们深入分析并提供一些实际的例子与操作经验。 稳定性差异: 通过路由器获取IP地…

STM32基于CubeIDE和HAL库 基础入门学习笔记:基础知识理论 开发环境建立

文章目录: 一:开发板和基础知识理论 1.开发板 2.基础知识理论* 二:CubeMX图形化编程 1.设置时钟(心脏) 1.1 开启RCC功能 1.2 开启RTC功能 1.3 配置时钟树 2.设置端口(五官四肢) 3.工…

Shopee、国际站卖家测评自养号方法大揭秘!

很多虾皮卖家都会经常提到“权重”这个词语,什么是权重?权重的作用是什么?如何提高产品的权重?今天就带大家来仔细了解下这个“权重”。 什么是权重? 权重泛指某一因素或指标相对于某一事物的重要程度。而Shopee权重…

由 Base64 展开的知识探讨

前言 在我们的业务应用中越来越多的应用到编码内容,例如在 API 中,给到后端的 SQL 都是通过 Base64 加密的数据等等。 能够发现我们的代码中,使用的 window 对象上的 btoa 方法实现的 Base64 编码,那 btoa 具体是如何实现的呢&a…

第二篇|研究数据哪里来——建筑业

数据是研究和产业发展的重要基石,然而无论是学者、企业还是研究机构往往都面临着“找数据难”的局面。本期将分享一些查找建筑相关的数据及资料的渠道。希望可以帮大家解决这一难题,有用求收藏求收藏求收藏~ 1.政府机构 可以查找国家、地方政府的建筑行…

应用在室外LED电子显示屏中的MiniLED背光

LED电子显示屏是一种通过控制半导体发光二极管的显示方式,是由几万–几十万个半导体发光二极管像素点均匀排列组成。它利用不同的材料可以制造不同色彩的LED像素点,以显示文字、图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。 LED显示屏…

安防监控视频汇聚EasyCVR平台的FLV视频流在VLC中无法播放的原因排查

众所周知,TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入,包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上,视频监控…

“中国软件杯”飞桨赛道晋级决赛现场名单公布

“中国软件杯”大学生软件设计大赛是由国家工业和信息化部、教育部、江苏省人民政府共同主办,是全国软件行业规格最高、最具影响力的国家级一类赛事,为《全国普通高校竞赛排行榜》榜单内赛事。今年,组委会联合百度飞桨共同设立了“智能系统设…

基于CAS的单点登录实践之路

前言 上个月我负责的系统SSO升级,对接京东ERP系统,这也让我想起了之前我做过一个单点登录的项目。想来单点登录有很多实现方案,不过最主流的还是基于CAS的方案,所以我也就分享一下我的CAS实践之路。 什么是单点登录 单点登录的…

Java Random 类的使用

Java中的Random类是用来生成伪随机数的工具类。它可以用来生成随机的整数、浮点数和布尔值。以下是Java Random类的一些常见用法: 创建Random对象: Random random new Random();生成随机整数: int randomNumber random.nextInt(); // 生…

新手也能看懂:如何理解 K8s 声明式 API ?

我们知道 Kubernetes(以下简称“K8s”)中各种资源对象的数据是通过 K8s 的 API 进行提交并持久化到存储 etcd 中的(称为K8s对象),K8s 对象是使用 K8s 的接口,kubelet 客户端通过操作这些对象来使用K8s能力。…