Spring Boot 日志 (初级)

news2024/11/25 23:51:40

什么是日志呢?其实就是一条条的打印语句,我们就可以根据打印出来的日志,去分析程序存在的问题等。虽然作为后端开发人员,日志并不是那么重要,但是在学习的过程中,也是比较重要的,可以使用在我们的项目中,所以我们也要去学习和了解。

目录

1.日志的作用

2.日志的使用

3.日志的格式和等级

4.配置日志和持久化

5.更加简单的日志打印​​​​​​​

1.日志的作用

先笼统的介绍几个作用

(1)系统监控

比如,可以监控系统,查看是否被攻击,都会记录下每一个客户端的行为(访问了哪些方法等)

(2)数据采集

比如,收集客户端的喜好等

(3)日志审计

这种一般是国家需要等

上面的几个作用看起来非常的高大尚,似乎对于现在的我们来说好像没多大作用,但是不仅有上面的作用,还有下面更贴切我们的实际意义。

第一:可以应用于我们的程序中,更好的排查和发现程序bug和问题

第二:可以使用在项目中,使项目更加的丰富

第三:可以装逼。毕竟这个词在外行人听起来,就是比较高大尚。

下面,我们就来学习如何去使用吧!

2.日志的使用

我们不使用System.out.println()去打印日志只有一句话,看起来非常的丑陋;我们看一下Spring打印的日志

看起来也是非常的beautifu,那它是如何实现的呢?请看vcr

(1)日志打印说明

我们打印日志都将会使用一个框架:slf4j (撒拉佛接),Spring也内置了该框架,所以我们只需要学习如何使用即可。

打印日志的步骤:一:获取日志对象 ;二:使用日志对象进行打印日志

(2)第一:获取日志对象

获取日志对象会使用一个工厂对象,直接调用并且接收即可。

完整代码:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogController {
    private static Logger log = LoggerFactory.getLogger(LogController.class);
}

代码解释:

工厂类需要一个参数,就是类名。

作用:日志需要知道是哪一个类下的方法,也就是用来定位。

拥有了日志对象,我们就可以打印日志了

(3)第二:使用日志对象打印日志

import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;

@Controller
public class LogController {
    private static Logger log = LoggerFactory.getLogger(LogController.class);
    @PostConstruct
    public void print() {
        System.out.println("===========================================");
        System.out.println("打印日志ing");
        log.info("打印日志ing");
        System.out.println("===========================================");
    }
}

打印结果:

我去,使用slf4j打印出的日志咋这么好看,跟系统日志一样,爱了爱了。

3.日志的格式和等级

(1)日志的格式

        上面我们介绍了日志的使用,下面先学习一下上述日志打印的格式

上述就是日志的格式了,其中有几处注意事项:

  • 配置的项目名称:

  • 打印日志的对象:

  • 日志的级别:这里我们下面直接介绍

(2)日志的级别

日志从高到低的级别依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE

  • FATAL:致命信息,表示需要立即被处理的系统级错误(一般不会出现,出现也不会通过日志的形式)
  • ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行
  • WARN:警告信息,不影响使用,但是需要去注意的问题
  • INFO:普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成等
  • DEBUG:调试信息,需要调试时候的关键信息打印
  • TRACE:追踪信息,比DEBUG更细粒度的信息事件(一般也不会被保留)

上述就是日志的各种级别,下面我们来观察日志框架默认可以打印出的日志级别

打印结果:

由此可见,slf4j框架默认打印的日志级别就是:info、warn、error,最高等级的直接没有,两个最低等级的默认不保留。

那还有什么办法可以保留指定等级的日志呢?答案当然是有的,那就是通过配置文件去配置即可

4.配置日志和持久化

首先,我们先来介绍日志的配置,上述我们知道,默认打印的日志级别是info及以上的,也就是debug和trace是不会打印。

(1)日志的配置

我们设置日志的级别是设置在某个目录下的最低级别日志是多少

  • 设置所有的路径下日志级别是:debug

然后运行发现:非常多的日志都打印出来了

  • 我们再配置回info级别:

我们发现:跟没有配置级别的是一样的。得出配置日志的作用:当年配置了某个路径下的日志级别后,那么该路径下系统打印出的日志级别就是我们配置的,但是其他路径依然是info

  • 我们现在来只设置我们包下的日志级别:

运行结果:debug的日志也可以打印出来了

OK,日志级别的配置到这里就完了,但是还是不推荐我们去随意配置日志级别。

(2)日志的持久化

上面我们使用的日志,都是打印在控制台上的,程序一结束就不见了,只有保存在外存上(硬盘)才能做到持久化,下面我们介绍日志如何保存在文件上。

  • 把日志保存在指定的文件目录下:

yml格式:

logging:
  file:
    path: D:/JavaCode/logger

程序运行后:

上面这种是配置文件路径,也就是会保存在指定问文件目录下。

  • 给日志配置指定文件名(项目中)

yml格式:

logging:
    file:
        name: xxxx

运行结果:

上面这种配置文件名字,得出的文件路径会跟随着项目的路径

注意点:如果上述的path和name同时设置,会以name为准,也就是以name为优先级

  • 配置日志文件的分割

yml格式:

logging:
    logback:
        rollingpolicy:
            max-file-size: 1KB

我们配置文件大小到底1kb就进行切割,也就是换一个文件进行存储。 

运行后:当大小到达1kb后,就进行了分割

对于日志,还有很多格式,比如说日志的格式,颜色等,这里就不介绍了

5.更加简单的日志打印

虽然说,我们目前的日志打印已经非常快了,但是还是很繁琐,下面介绍使用注解来打印日志

分成两步:第一步:添加lombok框架支持(导入依赖)第二步:使用@slf4j注解输出日志

(1)第一步:导入依赖

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

我们在创建项目的时候已经存在了,就不需要再导入

(2)第二步:代码编写(使用注解):@Slf4j

import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
@Slf4j
@Controller
public class LogController {
    //private static Logger log = LoggerFactory.getLogger(LogController.class);
    @PostConstruct
    public void print() {
        System.out.println("===========================================");
        //System.out.println("打印日志ing");
        log.trace("我是trace日志");
        log.debug("我是debug日志");
        log.info("我是info日志");
        log.warn("我是warn日志");
        log.error("我是error日志");
        System.out.println("===========================================");
    }
}

该注解默认的对象名字是:log,所以我们直接使用即可,下面看一下运行结果。

结果也是一样的,所以我们后续就直接使用注解去打印日志即可。


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

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

相关文章

OpenCV分水岭算法watershed函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 我们将学会使用基于标记的分水岭算法来进行图像分割。我们将看到&#xff1a;watershed()函数的用法。 任何灰度图像都可以被视为一个地形表…

vue项目实战速查记录

1.图片下载到本地 2.本地静态文件访问 3.元素大小相同,相互覆盖 1.图片下载到本地 实现原理:创建a标签,利用a标签下载属性. download(){const link document.createElement(a);link.href "图片地址";link.setAttribute(download, name);document.body.ap…

Docker核心技术:Docker原理之Namespace

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Docker核心技术 系列文章&#xff1a;Docker原理之Namespace&#xff0c;其他文章快捷链接如下&#xff1a; 应用架构演进容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 Docker核心技术&#xff1…

【Qt】 FFmpeg+Qt windows 32位或者64位环境搭建

简介 目前Ffmpeg官网&#xff08;64位连接&#xff09;下载的均为64位编译的&#xff0c;这要求我们采用的Qt creator也采用64位编译器。但是仍存在部分用户采用32位编译器&#xff0c;所以这部分用户需下载32 Ffmpeg&#xff08;32位连接&#xff09;。 根据使用的编译器位数…

ArkTS语言---基础知识

ArkTS是一种为构建高性能应用而设计的编程语言。ArkTS在继承TypeScript语法的基础上进行了优化&#xff0c;以提供更高的性能和开发效率。目前流行的编程语言TypeScript是在JavaScript基础上通过添加类型定义扩展而来的&#xff0c;而ArkTS则是TypeScript的进一步扩展。TypeScr…

【面经】C++八股文(地平线C++一面)

一、C11的新特性都有哪些&#xff1f; 1.1 自动类型推断 (auto) auto 关键字允许编译器自动推断变量的类型&#xff0c;从而简化代码的书写。 auto num 5; // int auto pi 3.14; // double auto str "Hello"; // const char*1.2 范围 for 循环 范围…

tomcat部署java项目 出现404访问不到

今天使用tomcat做项目部署,部署SSM项目把项目上传到tomcat下面的webapps后一直访问不到项目 一直报404访问不到资源&#xff0c;但是访问tomcat又可以&#xff0c;浏览器能出现tomcat的标致&#xff0c;查看logs里面的运行日志发现报错&#xff1a;org.apache.catalina.core.St…

PYTHON学习笔记(四、pyhton数据结构--列表)

&#xff08;1&#xff09;list列表 列表的含义是指&#xff1a;&#xff08;1&#xff09;一系列的按特定顺序排列的元素组成。&#xff08;2&#xff09;python中内置的可变序列。&#xff08;3&#xff09;在python中使用[]定义列表&#xff0c;元素与元素之间使用英文的逗…

Vue中渲染函数

why? 在绝大多数情况下&#xff0c;Vue 推荐使用模板语法来创建应用。然而在某些使用场景下&#xff0c;我们真的需要用到 JavaScript 完全的编程能力。这时渲染函数就派上用场了。 例如&#xff1a;下方要在多个模型上方设置对话框&#xff0c;如果使用Vue模板语法相对较困难…

c#中的From窗体

Windows Forms&#xff08;简称WinForms&#xff09;是.NET Framework中用于构建Windows桌面应用程序的一个组件。Form 类是WinForms中最基本的窗口类型&#xff0c;提供了一个容器&#xff0c;可以容纳控件&#xff08;如按钮、文本框、标签等&#xff09;。 以下是Form的一些…

数据结构之判断平衡二叉树详解与示例(C,C++)

文章目录 AVL树定义节点定义计算高度获取平衡因子判断是否为平衡二叉树完整示例代码结论 在计算机科学中&#xff0c;二叉树是一种非常重要的数据结构。它们被广泛用于多种算法中&#xff0c;如排序、查找等。然而&#xff0c;普通的二叉树在极端情况下可能退化成链表&#xff…

autoware.universe源码略读(3.17)--perception:occupancy_grid_map_outlier_filter

autoware.universe源码略读3.17--perception:occupancy_grid_map_outlier_filter Overview&#xff08;Class&#xff09;RadiusSearch2dfilter&#xff08;Class Constructor&#xff09;RadiusSearch2dfilter::RadiusSearch2dfilter&#xff08;mFunc&#xff09;RadiusSearc…

Transformer系列总结

文章目录 1、Transformer基本原理介绍1.Transformer 结构2.嵌入表示层3. 注意力层3.1 输⼊矩阵3.2 查询矩阵和键矩阵3.3 Q和K的转置的点击除以键向量维度的平⽅根3.4 应⽤softmax函数3.5 注意力矩阵通过分数矩阵乘以值矩阵得出3.6 注意⼒矩阵 4. 前馈层5. 残差连接与层归一化6.…

虚幻引擎,体积雾、体积光、镜头泛光

1、体积雾 这里介绍的是用于地面的体积雾效果&#xff0c;效果如图1-1&#xff1a; 图1-1 首先&#xff0c;需要场景中存在指数级高度雾并开启体积雾&#xff08;如图1-2&#xff09;。然后创建材质&#xff0c;材质域选择“体积”&#xff0c;混合模式选择“Additive”。材质节…

二叉树的构造问题 | LeetCode刷题笔记 | 每日练习 | 深度优先遍历| 广度优先遍历 | Java

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;本篇分享的是与构造二叉树&#x1f384;有关的问题&#xff0c;有关二叉树的基础知识可以点击此处跳转学习&#x1f448;&#xff0c;构造二叉树的就是…

嵌入式人工智能(18-基于树莓派4B的继电器JQC-3FF-S-Z)

1、继电器 继电器是一种电控开关设备&#xff0c;由一个电磁系统和一个控制电路组成。当控制电路给予电磁系统足够的电流或电压时&#xff0c;电磁系统会产生磁场&#xff0c;使其内部的触点发生动作。这个动作可以使电流或电压在主电路中开关或转换&#xff0c;起到控制电路的…

【EarthMarker】区域级和点级遥感图像理解的视觉提示学习框架

摘要 自然图像区域视觉提示使用户可以通过各种视觉标记&#xff0c;如框、点和其他形状&#xff0c;和AI进行交互。但是&#xff0c;自然图像和RS图像之间存在显著差异&#xff0c;现有的视觉提示模型在RS场景中面临着挑战。此外&#xff0c;RS MLLMs主要关注于解释图像级RS数…

中文诗歌生成

用transformer在诗歌集上训练出的模型 import os os.environ["KERAS_BACKEND"] "tensorflow" # param ["tensorflow", "jax", "torch"] os.environ[TF_CPP_MIN_LOG_LEVEL] 2 os.environ[HF_ENDPOINT] https://hf-mirro…

拥抱AI时代:解锁Prompt技术的无限潜力与深远影响

拥抱AI时代&#xff1a;解锁Prompt技术的无限潜力与深远影响 引言 在人工智能的浩瀚星空中&#xff0c;自然语言处理&#xff08;NLP&#xff09;无疑是最耀眼的星辰之一。随着技术的不断演进&#xff0c;NLP已经从最初的简单问答系统发展成为能够生成复杂文本、理解人类情感与…

JavaScript之WebAPIs-BOM

目录 BOM操作浏览器一、Window对象1.1 BOM&#xff08;浏览器对象模型&#xff09;1.2 定时器-延时函数1.3 js执行机制1.4 location对象1.5 navigator对象1.6 history对象 二、本地存储三、补充数组中的map方法数组中的join方法数组中的forEach方法(重点)数组中的filter方法(重…