Spring Boot 日志详解

news2024/11/24 3:37:56

Spring Boot 日志

  • 一、日志有什么用
  • 二、日志怎么用
  • 三、自定义日志打印
    • 3.1 在程序中得到日志对象
    • 3.2 使用日志对象打印日志
  • 四、日志级别
    • 4.1 日志级别有什么用
    • 4.2 日志级别的分类与使用
    • 4.3 日志级别设置
  • 五、日志持久化
    • 5.1 配置文件名
    • 5.2 配置保存路径
  • 六、更简单的日志输出 -- lombok
    • 6.1 添加 lombok 依赖
    • 6.2 输出日志
    • 6.3 lombok 原理解释
    • 6.4 lombok 更多注解说明

一、日志有什么用

日志是程序的重要组成部分。想象⼀下,如果程序报错了,不让你打开控制台查看⽇志,那么你能找到报错的原因吗?
答案是否定的,写程序不是买彩票,不能完全靠猜,因此⽇志对于我们来说,最主要的⽤途就是排除和定位问题。

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

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

以上这些都是⽇志提供的⾮常实⽤的功能。

二、日志怎么用

Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所示:
在这里插入图片描述

以上内容就是 Spring Boot 输出的控制台⽇志信息。

日志格式说明:
在这里插入图片描述

通过上述⽇志信息我们能得到以下 一个结论三个问题

  • Spring Boot 内置了⽇志框架(不然也输出不了⽇志)。
  • 默认情况下,输出的⽇志并⾮是开发者定义和打印的,那开发者怎么在程序中⾃定义打印⽇志呢?
  • ⽇志默认是打印在控制台上的,⽽控制台的⽇志是不能被保存的,那么怎么把⽇志永久的保存下来呢?
  • 日志打印级别默认为 INFO,那么怎样改变日志打印级别来筛选和控制日志的内容呢?

下⾯我们⼀起来寻找这些问题的答案 ~

三、自定义日志打印

开发者⾃定义打印⽇志的实现步骤:
1)得到日志对象;
2)使用日志对象提供的方法,输出自定义的日志内容。

System.out.println(); 也算是打印了日志,但是:
a. 只有打印的内容,没有其他相关信息,比如打印的时间、打印的类 (出处)…
b. 不能实现不同环境下的行为控制 (设置日志打印级别)。

3.1 在程序中得到日志对象

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

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

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

约定大于配置:(注意事项)

  • 参数只能设置为当前类的类对象。
  • Logger 对象是属于 org.slf4j 包下的,不要导入错包:
    在这里插入图片描述

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

常⻅的⽇志框架说明(了解)
在这里插入图片描述
slf4j 就是一层通用的封装,类似于 JDBC ~~

3.2 使用日志对象打印日志

⽇志对象的打印⽅法有很多种:info、debug、warn… 如下代码所示:

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

    @RequestMapping("/hello")
    public void sayHi() {
        // 2.使用日志对象提供的方法进行日志打印
        logger.trace("Hello,i am trace.");
        logger.debug("Hello,i am debug.");
        logger.info("Hello,i am info.");
        logger.warn("Hello,i am warn");
        logger.error("Hello,i am error");
    }
}

启动并运行,通过 http://localhost:8080/hello 访问,此时控制台打印出日志信息:
在这里插入图片描述

为什么 trace() 和 debug() 的打印日志没有显示呢?这与日志级别相关 ~~

四、日志级别

4.1 日志级别有什么用

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

4.2 日志级别的分类与使用

⽇志的级别分为:

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

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

级别越高接收到的消息就越少,如设置了 warn 就只能收到 warn、error、fatal 级别的日志了。

总共有 6 种级别,打印的时候为什么只有 5 种,而没有 fatal 呢?
因为 fatal 是 “致命” 的,只会在代码异常导致程序退出的时候才记录,自己没法自定义 ~~

4.3 日志级别设置

日志的输出级别默认是 info。

在上面我们自定义了五个等级的打印日志,却只看到了三个:

在这里插入图片描述

这是因为此时是默认日志级别 info,怎样进行日志级别设置呢?

日志级别配置只需要在配置⽂件中设置 “logging.level” 配置项即可,如下所示:

logging:
  level:
    root: trace

这是配置跟路径的日志级别。
而日志级别的设置可以是非常精细的 (根据包)

logging:
  level:
    root: warn
    com:
      example:
        demo: debug

在这里插入图片描述

重新启动运行,此时再通过 http://localhost:8080/hello 访问:

在这里插入图片描述

这样就可以自定义设置日志级别了 ~~

五、日志持久化

以上的⽇志都是输出在控制台上的,然⽽在⽣产环境上咱们需要将⽇志保存下来,以便出现问题之后追溯问题,把⽇志保存下来的过程就叫做持久化。

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

5.1 配置文件名

# 设置⽇志⽂件的⽂件名
logging:
  file:
    name: C:\yyhjava_project\tmp\yyh.log

只指定文件名的话,就是生成在项目的根路径 ~~

配置完成后,启动并运行,此时在 C:\yyhjava_project\tmp\ 路径下:

在这里插入图片描述

就生成了 yyh.log 日志文件。打开它:

在这里插入图片描述

此时通过 http://localhost:8080/hello 访问:

在这里插入图片描述

得到结论:日志是追加的,不会覆盖 ~~
重新运行依然是追加:

在这里插入图片描述

一直追加,文件不是会特别大吗?
并不是。当日志比较大的时候,会自动分隔成多个文件。

5.2 配置保存路径

# 设置⽇志⽂件的⽬录
logging:
  file:
    path: C:\yyhjava_project\tmp\

配置完成后,启动并运行,此时在 C:\yyhjava_project\tmp\ 路径下:
在这里插入图片描述

生成了 spring.log 日志文件 (默认文件名就是 spring.log)。

各种性质与文件名方式生成的一致 ~~

六、更简单的日志输出 – lombok

每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加一遍也很麻烦,这⾥讲一种更好⽤的⽇志输出⽅式,使⽤ lombok 来更简单的输出。
1)添加 lombok 框架支持
2)使用 @slf4j 注解输出日志

6.1 添加 lombok 依赖

在这里插入图片描述

或者右击鼠标添加依赖:
在这里插入图片描述
在这里插入图片描述

或者使用插件:
在这里插入图片描述

6.2 输出日志

package com.example.demo;

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

@RestController
@Slf4j
@RequestMapping("/p")
public class TestLogging {
    @RequestMapping("/log")
    public void loggerTest() {
        log.error("------------------- error -----------------");
    }
}

通过 http://localhost:8080/p/log 访问后,查看控制台:
在这里插入图片描述

也成功打印出了日志。

注意: 使用 @Slf4j 注解,在程序中使⽤ log 对象即可输入日志,并且只能使⽤ log 对象才能输出,这是 lombok 提供的对象名。
在这里插入图片描述

6.3 lombok 原理解释

lombok 能够打印日志的秘密就在 target ⽬录⾥⾯,target 为项目最终执行的代码,查看 target 目录如下:
在这里插入图片描述
在这里插入图片描述

Java 程序的运行原理:
在这里插入图片描述
Lombok 的作用如下图所示:
在这里插入图片描述

6.4 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/157667.html

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

相关文章

Go第 13 章 :2-客户信息关系系统

Go第 13 章 :2-客户信息关系系统 13.1 项目需求分析 模拟实现基于文本界面的《客户信息管理软件》。该软件能够实现对客户对象的插入、修改和删除(用切片实现),并能够打印客户明细表 13.2 项目的界面设计 主菜单界面 添加客户…

SegFormer笔记(1)安装

一、代码地址github地址:https://github.com/NVlabs/SegFormer二、我的系统配置:1、硬件2、软件win10,vs2022,python3.7三、创建虚拟环境conda create -n MySegFormer python3.7 numpy conda activate MySegFormer python会显示如…

【知识图谱工具汇总】

一,图表示学习与计算框架 1)PyTorch Geometric(PyG) 由德国多特蒙德工业大学研究者推出的基于PyTorch的几何深度学习扩展库。PyG在学术中是比较热门的框架,但是PyG对于异构图以及大规模的图的学习存在着较大的局限性…

【UE4 第一人称射击游戏】39-“M4A1”武器设置

上一篇:【UE4 第一人称射击游戏】38-拾取“M4A1”的提示信息步骤:在“AK47”文件夹中拷贝一份“Weapon_Base”拷贝到“M4A1”文件夹下,重命名为“Weapon_M4A1”打开“Weapon_M4A1”,新添加一个网格体组件骨架网格体选择“M4A1_wea…

Linux编辑器-gcc/g++使用

目录 背景: 预处理: 编译: 汇编: 连接: 静态连接: 动态连接: 自动化编程make/makefile: 背景: 我们知道任何一个c语言或者c文件想要生成一个可执行程序必须完成4个…

NotepadAttr

EntityMyPKAttr目录概述需求:设计思路实现思路分析1.Notepads2.EntityMyPK3.EntityMyPKAttr4.EntitiesMyPK5.EntityMyPKEntityMyPKAttrEntitiesMyPKWebContralBaseAtParaCashChartType参考资料和推荐阅读Survive by day and develop by night. talk for import biz …

JS面试题--JS函数式编程

JS函数式编程 实现apply、call、bind 01_call函数的实现 // apply/call/bind的用法 // js模拟它们的实现? 难度// 给所有的函数添加一个hycall的方法 同个原型链 Function.prototype.hycall function (thisArg, ...args) {// 在这里可以去执行调用的那个函数(foo)// 问题: …

亚马逊云科技:“云”筹帷幄,打造数据驱动型企业

数据对提高企业生产和资源配置的效率、优化经济结构的作用日益凸显。工业和信息化部发布的《“十四五”大数据产业发展规划》已明确将数据作为新时代重要的生产要素和国家基础性战略资源。埃森哲研究显示,到2022年,90%的企业战略明确将把数据作为关键的企…

前端面试题回顾——React重要知识

文章目录React相关问题1. 函数式组件与Class组件有什么不同?2. 说说React的fiber架构?3. 协调4. 虚拟DOM (Virtual DOM)React相关问题 1. 函数式组件与Class组件有什么不同? 答: ① 函数式组件不需要继承,直接 “fun…

数据结构基础——认识数据结构与算法

目录 🍔什么是数据结构? 🌭1.数据的逻辑结构 🌭NUM 1 : 集合 🌭NUM 2 : 线性结构 🌭NUM 2 : 树形结构 🌭NUM 4 :图结构(网状结构)…

浅谈反弹shell

目录反弹shell总结一、文件描述符二、重定向1、输入重定向2、输出重定向3、错误输出重定向4、exec 绑定重定向三、实现反弹shell的几种方式方法一: find 反弹ubuntu find反弹shell失败的问题任务计划反弹shell失败的问题方法二:使用python反弹&#xff0…

Flink系列-4、Flink运行架构

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址:https://flink.apache.org/ 学习资料:https://flink-learning.org.cn/ 目录Flink基石Fli…

刚当上leader,我让组员去开会,他非说有更重要的会

☆ 职场上经常有那么一种情况就是组长喊组员开会,开周会,开晨会,开各种会,而更有一种常见的情况呢就是组长缺失威严,喊组员开会,组员不听话,说有更重要的会议,不想参加。 ☆ 本文将以…

VIT学习心得

来源:投稿 作者:橡皮 编辑:学姐 小声逼逼 在过去的两年里,Vision Transformer(ViT)是计算机视觉(cv)领域最有影响力的工作之一。「它推翻了2012年在Alex net中提出的CNN在CV领域的统治地位: 当能够获得足够多的预训练…

无接触式磁旋转编码器AS5040介绍

无接触式磁旋转编码器AS5040简介AS5040 是一款无接触式磁旋转编码器,用于精确测量整个360内的角度。此产品是一个片上系统,在单个封装内整合了集成式Hall 元件、模拟前端和数据信号处理功能。测量角度时,只需简单地配备1 个在芯片中心上方旋转…

Spring5的全细节回顾总结

概述: https://cntofu.com/book/95/33-what-new-in-the-spring-framework.md 这个不错。 轻量级javaee框架。 针对于bean的生命周期进行管理。 解决企业应用开发的复杂性。 核心: ​ IOC:控制反转,把创建对象的过程交给sprin…

第一天 Blender操作 | 大帅老猿threejs特训【超详细】

前言 这一天主要是基础理论的学习。 本人学习资料仓库 https://gitee.com/zhang_dezheng_hsr/three-demo.git YCY-TrainingCamp-S2: 在原有的文件上添加本人的学习记录 第一天 Blender操作 | 大帅老猿threejs特训【超详细】【我在掘金的同名文章】 一、大纲 二、THREE 基础概…

Linux查看某个应用的CPU/内存/网卡使用情况

1.查看CPU的使用率 # ps -ef | grep zabbix 进程号是1715 # top -p 1715 可以看到CPU的使用率是0 , 内存的使用率是0 2.查看内存真实使用了多少 #cat /proc/[pid]/status #cat /proc/1715/status VmPeak:进程所使用的虚拟内存的峰值 VmSize: 进程当前使用…

22.字符串初始化方法及赋值,字符串和指针总结

目录 初始化 1.字符数组初始化 2.指针指向文字常量区,初始化 3.指针指向堆区,堆区存放字符串 使用时赋值 1.字符数组,使用scanf或者strcpy 2.指针指向文字常量区 3.指针指向堆区,堆区存放字符串 初始化 1.字符数组初始化 …

各国家语言代码对照表

来源如下 Language Code Tablehttp://www.lingoes.cn/zh/translator/langcode.htm 详情如下 语言代码语言名称af南非语af-ZA南非语ar阿拉伯语ar-AE阿拉伯语(阿联酋)ar-BH阿拉伯语(巴林)ar-DZ阿拉伯语(阿尔及利亚)ar-EG阿拉伯语(埃及)ar-IQ阿拉伯语(伊拉克)ar-JO阿拉伯语(约旦…