SpringBoot 日志文件:日志的作用?为什么要写日志?

文章目录

  • 🎇前言
  • 1.日志长什么样子?
  • 2.自定义打印日志
    • 2.1 在程序中得到日志对象
    • 2.2 使用日志对象打印日志
  • 3.日志级别
    • 3.1 日志级别的分类与使用
    • 3.2 日志级别有什么用呢?
    • 3.3 日志级别的设置
  • 4.日志持久化保存
  • 5.更方便的日志输出
    • 5.1 添加 lombok 框架
    • 5.2 使用注释输出日志
  • 🎆总结

在这里插入图片描述

🎇前言

日志、日志,日志就是记录发生了什么。为啥要记录发生了什么呢?想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报错的原因吗?因此我们需要记录程序的行为,通过这些行为能让我们更好的发现和定位错误所在位置。

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

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

可以看出来日志在程序中扮演这非常重要的角色了。

1.日志长什么样子?

SpringBoot 项目启动的时候默认就会有日志输出,如下图:
在这里插入图片描述

通过上述日志信息提出三个疑问:

  1. Spring Boot 如何打印日志?(提前把这个说了:它内置了日志框架,因此可以打印日志)
  2. 默认情况下,输出的日志并非是开发者定义和打印的,开发者怎么在程序中⾃定义打印⽇志呢?
  3. 日志默认打印在控制台上,而控制台的日志不能保存,如何将日志永久保存呢?

接下来让我们寻找找答案

2.自定义打印日志

自定义打印日志分为两步走:

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

2.1 在程序中得到日志对象

//1.得到日志对象
private final static Logger logger = LoggerFactory.getLogger(TestController.class);

在导包时,我们使用的时slf4j包下面的 Logger,这里不要导包导错了。
在这里插入图片描述
因为 SpringBoot 中内置了日志框架slf4j,所以我们可以直接在程序中调用slf4来输出日志。

2.2 使用日志对象打印日志

// 2.使⽤⽇志打印⽇志
logger.info("--------------要输出⽇志的内容----------------");

日志打印结果:
在这里插入图片描述
这日志打印出来看起来像是一串字符串,我们如何去看出来日志打印的是什么东西呢?看下图的介绍:
在这里插入图片描述

日志之间有很多等级划分,我们通常把他分为六个等级。

3.日志级别

3.1 日志级别的分类与使用

日志级别一览表(由上到下等级递增):

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

3.2 日志级别有什么用呢?

  1. 日志级别可以帮你筛选出重要的信息,⽐如设置⽇志级别为 error,那么就可以只看程序的报错⽇志了,对于普通的调试⽇志和业务⽇志就可以忽略了,从而节省开发者信息筛选的时间。
  2. 日志级别可以控制,不同环境下打印日志的要求可以设置(一般分为开发环境和生产环境),⼀个程序是否需要打印⽇志,如开发环境我们需要很详细的信息,⽽⽣产环境为了保证性能和安全性就会输出尽量少的日志。

第一条也许比较难理解,我们写代码演示一下,我们知道日志等级默认的是info级别的,我们打印如下日志:

@Controller
@ResponseBody
public class TestController {
    
    private final static Logger logger = LoggerFactory.getLogger(TestController.class);
    
    @RequestMapping("/sayHi")
    public String sayHi(String name) {

            logger.trace("----------- 我是 trace 级别的日志 -----------");
            logger.debug("----------- 我是 debug 级别的日志 -----------");
            logger.info("----------- 我是 info 级别的日志 -----------");
            logger.warn("----------- 我是 warn 级别的日志 -----------");
            logger.error("----------- 我是 error 级别的日志 -----------");
        if(!StringUtils.hasLength(name)) {
            name ="张三";
        }
        String res = "你好" + name;
        return  res;

    }

观察控制台:
在这里插入图片描述
你会新奇的发现,比info级别小的日志,没有出现在控制台,也就是没有打印,这就是第一条说的, 日志级别可以帮你筛选出重要的信息。

3.3 日志级别的设置

这个日志级别怎么有用,我们应该如何设置日志级别呢?答案是在配置文件(yaml文件或者properties文件)中设置,我们这里使用yaml文件。
打印大于error级别的日志,如下图,:

logging:
  level:
    root: error

设置完等级,我们再次启动项目,看看是否符合我们的预期,看下图,它符合我们的预期,只打印了 error级别的日志。
在这里插入图片描述

4.日志持久化保存

上方举得例子都是打印在控制台上的,然而在生产环境上需要将日志持久化保存下来,以便追溯问题位置。

想要将日志进行持久化保存,只需要在配置文件中指定日志的存储目录或者指定日志保存文件名之后,SpringBoot 就会将控制台的日志写到我们配置的目录或文件中去。

配置文件的保存路径:

# 设置日志文件的目录
logging:
  file:
    path: F:\\info\\

我们再次启动项目,打开设置好的路径,看看是否有日志保存:
打开后可以看到有日志保存,证明我们的设置是正确的。
在这里插入图片描述

5.更方便的日志输出

每次打印日志,我们都是使用 LoggerFactory.getLogger(×××.class)这样的操作,代码显得冗余,我们可以使用更简单好用的日志输出方法,使用 lombok 来更简单的输出。
其步骤大概分为两步:

  1. 添加 lombok 框架支持
  2. 使用 @Slf4j 注解输出日志

5.1 添加 lombok 框架

这个框架提供了非常多的简便注解,可以减少代码冗余,如果有需要可以去了解一下!

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

5.2 使用注释输出日志

我们在类上方添加@Slf4j注释,在使用时我们就会得到一个对象log对象。代码如下:

@Controller
@ResponseBody
@Slf4j
public class TestController {
    @RequestMapping("/sayHi")
    public String sayHi(String name) {

            log.trace("----------- 我是 trace 级别的日志 -----------");
            log.debug("----------- 我是 debug 级别的日志 -----------");
            log.info("----------- 我是 info 级别的日志 -----------");
            log.warn("----------- 我是 warn 级别的日志 -----------");
            log.error("----------- 我是 error 级别的日志 -----------");
        if(!StringUtils.hasLength(name)) {
            name ="张三";
        }
        String res = "你好" + name;
        return  res;

    }
}

🎆总结

  1. 日志时程序中的重要组成部分,使用日志可以快速的发现和定位问题。
  2. 在配置文件中设置日志时,设置的等级越高,收到的日志信息也就越少。
  3. SpringBoot 内置了日志框架,默认情况下使用的是 info 日志级别打印在控制台上,我们可以通过配置文件将日志持久化。
  4. 在手搓日志中,代码有冗余,我们可以使用 lombok 提供的 @Slf4j 注解和 log对象 快速的打印自定义日志。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

android用java生成crc校验位

在串口通信中&#xff0c;经常会用到后两位生成crc校验位的情况。 下面是校验位生成方法&#xff1a; public static String getCRC(String data) {data data.replace(" ", "");int len data.length();if (!(len % 2 0)) {return "0000";}in…

服务器技术(三)--Nginx

Nginx介绍 Nginx是什么、适用场景 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好。 Nginx专为性能优化而开发&#xff0c;性能是其最重要的考量&#xf…

3-css高级特效-1

01-平面转换 简介 作用&#xff1a;为元素添加动态效果&#xff0c;一般与过渡配合使用 概念&#xff1a;改变盒子在平面内的形态&#xff08;位移、旋转、缩放、倾斜&#xff09; 平面转换也叫 2D 转换&#xff0c;属性是 transform 平移 transform: translate(X轴移动距…

最新导则下生态环评报告编制要求与规范

根据生态环评内容庞杂、综合性强的特点&#xff0c;依据生态环评最新导则&#xff0c;将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、10大专题(生态环评报告编制、土地利用图的制作、植被类型及植被覆盖度图的制作、物种适宜生境分布图的制作、生物多样性测定、生物量及…

基于matlab基于预训练的膨胀双流卷积神经网络的视频分类器执行活动识别(附源码)

一、前言 此示例首先展示了如何使用基于预训练的膨胀 3-D &#xff08;I3D&#xff09; 双流卷积神经网络的视频分类器执行活动识别&#xff0c;然后展示了如何使用迁移学习来训练此类视频分类器使用 RGB 和来自视频的光流数据 [1]。 基于视觉的活动识别涉及使用一组视频帧预…

STM32外设系列—DHT11

文章标题 一、DHT11简介二、数据手册分析2.1 接口说明2.2 串行通信说明2.2.1 单总线通信2.2.2 单总线传输数据位定义2.2.3 时序图 三、DHT11程序设计3.1 初始化GPIO3.2 发送起始信号3.3 接收一个字节数据3.4 接收温湿度信息并校准 四、总结 一、DHT11简介 DHT11是一款常用的数…

快速点特征直方图(FPFH)描述子提取

快速点特征直方图&#xff08;Fast Point Feature Histograms&#xff0c;FPFH&#xff09;介绍 快速点特征直方图&#xff08;Fast Point Feature Histograms&#xff0c;FPFH&#xff09;是一种基于点的描述子&#xff0c;用于描述点云数据中的局部几何信息。FPFH描述子是在…

浅尝kubernetes

浅尝kubernetes 前言&#xff1a;我们早学习一门技术之前并不需要从头到尾的详细的查看一遍&#xff0c;只需要看一看是什么&#xff1f;能干什么&#xff1f;怎么用&#xff1f;即可&#xff01; 一、了解kubernetes Kubernetes 也称为 K8s&#xff0c;是用于自动部署、扩缩和…

【C/C++实现进程间通信 二】消息队列

文章目录 前情回顾思路源码Publisher.cppSubscriber.cpp 效果 前情回顾 上一期已经讲解过了进程的相关概念以及进程间通信的实现原理&#xff0c;下面仅展示消息传递机制实现1进程间通信的相关代码。 思路 /*本项目主要用于以消息传递机制的方式进行进程间通信的测试。1.主要…

Odoo16 微信公众号模块开发示例

Odoo16 微信公众号模块开发示例 本模块基于 aiohttp asyncio 进行异步微信公众号接口开发, 仅实现了部分 API 仅供学习参考&#xff0c;更完善的同步接口请参考&#xff1a;wechatpy 或 werobot&#xff0c;可用来替代 模块中的 wechat client。 业务需求 小程序中需要用户…

pdf文档多页内插入统一图片

常用来添加公司logo、签名、印章等等 概括来说就是插入同一个图片&#xff0c;然后复制在每一页&#xff08;自动&#xff09; 用的是福昕pdf阅读器 首先打开pdf&#xff1a; 点击图像标注功能&#xff1a; 在弹出窗口中选择浏览&#xff0c;点击需要插入的图片&#xff08…

在个人电脑上部署ChatGLM2-6B中文对话大模型

简介 ChatGLM2-6B 是清华大学开源的一款支持中英双语的对话语言模型。经过了 1.4T 中英标识符的预训练与人类偏好对齐训练&#xff0c;具有62 亿参数的 ChatGLM2-6B 已经能生成相当符合人类偏好的回答。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&…

计算机网络—网络层

文章目录 网络层服务虚电路网络数据报网络 IPv4IP数据报IP数据报分片 IP编址&#xff08;IPv4&#xff09;有类IP地址IP子网划分子网掩码 无类IP地址&#xff08;CIDR&#xff09;DHCPNATICMP协议 路由算法链路状态路由算法距离向量路由算法不同子网之间的路由算法学习RIP协议O…

【深度学习】3-3 神经网络的学习- 导数梯度

导数 导数就是表示某个瞬间的变化量&#xff0c;式子如下&#xff1a; 式子的左边&#xff0c;表示f(x)关于x的导数&#xff0c;即f(x)相对于x的变化程度。式子表示的导数的含义是&#xff0c;x的“微小变化”将导致函数f(x)的值在多大程度上发生变化。其中&#xff0c;表示…

了解一下EPC模式和它的优势

目录 什么是EPCEPC的优势有哪些&#xff1f;BT、BOT、EPC分别是什么模式&#xff1f;总结 什么是EPC EPC是Engineering&#xff08;工程&#xff09;&#xff1a;代表设计、采购和施工总承包。Procurement&#xff08;采购&#xff09;&#xff1a;代表采购和物资管理。Constru…

各牌浏览器设置地址栏显示完整URL

有时候&#xff0c;我们在浏览器的地址栏输入URL后&#xff0c;需要查看完整的URL路径&#xff0c;比如想看到是http协议还是https协议。 目前大多数浏览器都直接将协议头隐藏&#xff0c;需要复制出地址&#xff0c;或者点击地址栏才能看到&#xff0c;比较麻烦。 浏览器支持通…

Docker 部署 jar 项目

文章目录 1、上传jar包2、新建 Dockerfile 文件3、新建 deploy.sh 脚本&#xff08;创建并运行&#xff09;4、新建 upgrade.sh 脚本&#xff08;更新&#xff09; 1、上传jar包 2、新建 Dockerfile 文件 添加jar包及修改端口 # 基础镜像 FROM java:8 # 添加jar包 ADD servic…

【STM32】基于stm32的阿里云智能家居

摘 要 智能家居是一种通过物联网将家里的各种电器设备连接在一起&#xff0c;并由中心控制器统一管理的信息系统。系统的核心是各类家居信息的采集与处理。阿里云能够提供云端的数据存储和分析功能&#xff0c;可以作为智能家居中心控制器的重要平台。 本文主要研究了基于阿里云…

WPF 控件设置透明度的方法

方法一&#xff1a;通过 Opacity 属性设置背景色透明度。范围从0-1&#xff0c;0表示完全透明&#xff0c;看不见。 通过 Opacity 属性去改变控件透明度 会影响子控件的透明度&#xff0c;是因为Opacity属性是在UIElement 类(以及Brush基类)中定义&#xff0c;所有元素都具有该…

Unity VR 开发教程:Meta Quest 一体机开发 (二)混合现实 MR 透视 Passthrough 环境配置

文章目录 &#x1f4d5;教程说明&#x1f4d5;配置透视的串流调试功能&#x1f4d5;第一步&#xff1a;设置 OVRManager&#x1f4d5;第二步&#xff1a;添加 OVRPassthroughLayer 脚本&#x1f4d5;第三步&#xff1a;在场景中添加虚拟物体&#x1f4d5;第四步&#xff1a;删除…