【Spring】SpringBoot日志

SpringBoot日志

  • 日志概述
  • 日志使用
  • 打印日志
    • 获取日志对象
    • 使用日志对象打印日志
    • 日志框架介绍
      • 门面模式
      • SLF4J框架介绍(simple logging facade for java)
    • 日志格式说明
    • 日志级别
      • 日志级别的分类
      • 日志级别的使用
    • 日志配置
      • 配置日志级别
      • 日志持久化
        • 配置日志文件的路径和文件名
        • 配置日志文件的保存路径
      • 配置日志文件分割
  • 更简单的日志输出

日志概述

  1. 为什么要学习⽇志
    ⽇志对我们来说并不陌⽣, 从JavaSE部分, 我们就在使⽤ System.out.print 来打印⽇志了. 通过打印⽇志来发现和定位问题, 或者根据⽇志来分析程序的运⾏过程.在Spring的学习中, 也经常根据控制台的⽇志来分析和定位问题.

随着项⽬的复杂度提升, 我们对⽇志的打印也有了更⾼的需求, ⽽不仅仅是定位排查问题.
⽐如需要记录⼀些⽤⼾的操作记录(⼀些审计公司会要求), 也可能需要使⽤⽇志来记录⽤⼾的⼀些喜好,把⽇志持久化, 后续进⾏数据分析等. 但是 System.out.print 不能很好的满⾜我们的需求, 我们就需要使⽤⼀些专⻔⽇志框架(专业的事情交给专业的⼈去做)

日志使用

Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所⽰:
在这里插入图片描述
我们可以看到SpringBoot答应出来的日志却少了很多信息

SpringBoot打印出来的日志有 日志时间 日志级别 线程 打印日志的位置 日志信息等

springboot内置了日志框架slf4j,我们可以直接在程序中调用slf4j来输出日志

打印日志

打印日志的步骤:

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

获取日志对象

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

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

LoggerFactory.getLogger需要传递一个参数,标识这个日志的名称,这样可以更清晰的直到是哪个类输出的日志,当有问题时,可以更方便直观的定位到问题类

使用日志对象打印日志

日志对象的打印方法有很多种,我们可以先使用info()方法来输出日志

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 LogController {
    private static Logger logger = LoggerFactory.getLogger(LogController.class);

    @RequestMapping("/log")
    public String logger(){
        logger.info("这是一段日志");
        return "打印日志";
    }
}

在这里插入图片描述

日志框架介绍

在这里插入图片描述

SLF4J不同于其他日志框架,他不是一个真正的日志实现,而是一个抽象层,对日志框架指定的一种规范,标准,接口,所有SLF4J并不能独立使用,需要和具体的日志框架配合使用

门面模式

SLF4J是门面模式的典型应用

门面模式(Facade Pattern)是一种软件设计模式,它提供了一个统一的接口,用来访问子系统中的一群接口。这个模式通过创建一个高层接口,简化了客户端与子系统之间的交互,从而降低了系统之间的耦合度。

通常情况下,一个系统由多个子系统组成,每个子系统都有自己的接口和功能。而客户端需要与这些子系统进行交互,这样可能会导致客户端代码变得复杂,并且对系统的变化比较敏感。门面模式的出现正是为了解决这个问题。

通过门面模式,客户端只需要和门面对象交互,而门面对象负责将请求委派给相应的子系统进行处理。这样一来,客户端就不需要了解子系统的具体实现细节,从而降低了客户端和子系统之间的耦合度,同时也方便了对子系统的修改和维护。

总的来说,门面模式可以帮助简化复杂系统的接口,提高系统的灵活性和可维护性,同时也能够隐藏系统的复杂性,使客户端更加容易使用。

在这里插入图片描述
门面模式主要包含两种角色

外观角色,也成为门面角色,系统对外的统一接口
子系统角色,可以同时有一个或多个SubSystem,每个SubSystem都不是一个单独的类,而是一个类的集合,SubSystem并不知道Facade的存在,

SLF4J框架介绍(simple logging facade for java)

SLF4J就是其他日志框架的门面,SLF4J可以理解为是提供日志服务的统一API接口,并不涉及到具体的日志逻辑实现

不引入日志门面

常见的日志框架有log4j ,logback等 如果一个项目已经使用log4j,而你依赖的另一个类库,假如依赖另一个日志框架logback,那么就需要吧logback也加进去

存在问题

  1. 不同的日志框架的API接口和配置文件不同,如果多个日志框架并存,那么不得不维护多套配置文件(这里的配置文件指的是用户自定义的配置文件)
  2. 如果要更换日志框架,应用程序将不得不修改代码,并且修改过程中可能会存在一些代码冲突
  3. 如果引入的第三方框架,使用了多套,那就不得不维护多套配置

引入日志门面

引入日志门面框架后,应用程序和日志框架之间有了统一 的API接口,此时应用程序只需要维护一套日志文件配置,且当底层实现框架改变时,也不需要更改应用程序代码

日志格式说明

在这里插入图片描述
从上图可以看到,⽇志输出内容元素具体如下:

  1. 时间⽇期:精确到毫秒
  2. ⽇志级别:ERROR, WARN, INFO, DEBUG 或TRACE
  3. 进程ID
  4. 线程名
  5. Logger名(通常使⽤源代码的类名)
  6. ⽇志内容

日志级别

⽇志级别代表着⽇志信息对应问题的严重性, 为了更快的筛选符合⽬标的⽇志信息

日志级别的分类

在Spring框架中,日志级别通常遵循通用的日志级别标准,比如 SLF4J 或 Logback 中定义的日志级别。Spring框架本身并没有定义自己的日志级别,而是使用这些通用的标准。以下是常见的日志级别:

TRACE:提供非常详细的日志信息,通常用于调试,跟踪程序执行过程中的细节。

DEBUG:用于输出调试信息,用于辅助定位问题和调试程序。

INFO:提供一般性的运行时信息,表明应用程序正在运行。

WARN:表示潜在的问题,不会导致应用程序停止运行,但可能需要引起注意。

ERROR:用于指出虽然发生了错误,但仍然允许程序继续运行。

FATAL:指出严重的错误,可能导致应用程序退出。

在配置Spring应用程序的日志级别时,可以通过配置文件(比如logback.xml或log4j2.xml)或者通过代码来设置。一般来说,通过配置文件进行设置更为灵活,可以根据不同的包或类设置不同的日志级别。在Spring中,也可以通过Spring Boot的application.properties或application.yml文件来配置日志级别。

总的来说,通过合理设置日志级别,可以帮助开发人员了解应用程序的运行情况,快速定位问题,提高系统的可维护性和稳定性。

日志级别的使用

⽇志级别是开发⼈员⾃⼰设置的. 开发⼈员根据⾃⼰的理解来判断该信息的重要程度

针对这些级别, Logger 对象分别提供了对应的⽅法, 来输出⽇志

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 LogController {
    private static Logger logger = LoggerFactory.getLogger(LogController.class);

    @RequestMapping("/log")
    public String logger(){
        logger.trace("这是一段trace日志");
        logger.debug("这是一段debug日志");
        logger.info("这是一段info日志");
        logger.warn("这是一段warn日志");
        logger.error("这是一段error日志");
        return "打印日志";
    }
}

SpringBoot 默认的⽇志框架是Logback, Logback没有 FATAL 级别, 它被映射到 ERROR .
出现fatal⽇志,表⽰服务已经出现了某种程度的不可⽤, 需要需要系统管理员紧急介⼊处理. 通常情况下, ⼀个进程⽣命周期中应该最多只有⼀次FATAL记录.
在这里插入图片描述
结果发现只打印了info,warn和error级别的日志

这与日志级别的配置有关,日志的输出默认级别时info级别 ,所以只会打印大于等于此级别的日志,也就是info,warn和error

日志配置

上述是⽇志的使⽤, ⽇志框架⽀持我们更灵活的输出⽇志, 包括内容, 格式等

配置日志级别

我们可以在配置文件application.yml中配置logging.level配置项即可
在这里插入图片描述
在这里插入图片描述
我们可以发现此时就可以打印出Debug级别的日志了

日志持久化

以上的⽇志都是输出在控制台上的, 然⽽在线上环境中, 我们需要把⽇志保存下来, 以便出现问题之后追溯问题. 把⽇志保存下来就叫持久化.

日志持久化的两种方式

  1. 配置日志文件名
  2. 配置日志的存储目录
配置日志文件的路径和文件名

yml配置文件配置
设置文件的文件名
在这里插入图片描述

在这里插入图片描述

配置日志文件的保存路径

这种方式只能设置日志的路径,文件名为固定的spring.log

在这里插入图片描述
在这里插入图片描述

注意:
logging.file.name 和 logging.file.path 两个都配置的情况下, 只⽣效其⼀, 以logging.file.name 为准

配置日志文件分割

如果我们的⽇志都放在⼀个⽂件中, 随着项⽬的运⾏, ⽇志⽂件会越来越⼤, 需要对⽇志⽂件进⾏分割

当然, ⽇志框架也帮我们考虑到了这⼀点, 所以如果不进⾏配置, 就⾛⾃动配置
默认⽇志⽂件超过10M就进⾏分割

配置项说明默认值
logging.logback.rollingpolicy.file-name-pattern⽇志分割后的⽂件名格式${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.max-file-size⽇志⽂件超过这个⼤⼩就⾃动分割10MB

配置文件分割

yml配置

logging:
  logback:
    rollingpolicy:
      max-file-size: 1KB
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
  1. ⽇志⽂件超过1KB就分割(设置1KB是为了更好展⽰. 企业开发通常设置为200M, 500M等, 此处没
    有明确标准)
  2. 分割后的⽇志⽂件名为: ⽇志名.⽇期.索引

在这里插入图片描述

更简单的日志输出

每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐, 且每个类都添加⼀遍, lombok给我们提供了⼀种更简单的⽅式.

  1. 添加 lombok 框架⽀持
  2. 使⽤ @slf4j 注解输出⽇志。
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class LogController {
//    private static Logger logger = LoggerFactory.getLogger(LogController.class);

    @RequestMapping("/log")
    public String logger(){
    	//此时对象名称为固定的log
        log.trace("这是一段trace日志");
        log.debug("这是一段debug日志");
        log.info("这是一段info日志");
        log.warn("这是一段warn日志");
        log.error("这是一段error日志");
        return "打印日志";
    }
}

在这里插入图片描述
我们可以发现 这个注解的生命周期只存在于源代码阶段
在这里插入图片描述
**代码在经过编译之后 自动为我们生成了Logger对象 **

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

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

相关文章

若依如何进行页面路由跳转,路由跳转时如何携带参数(超详细图文教程)

我们经常会有这样需求,当我们在一个页面时,想要跳转到另一个页面,但是跳转的同时还需要携带参数。那么这种情况在若依系统中该如何做呢,下面我们来说一下。 文章目录 问题提出:一、创建目标页面的路由(也就是图2的路由…

到底是什么是Python?语言的核心是什么?

文章目录 前言一、为什么提出python编程的核心是什么?二、Python需要REPL?三、Python的哪些部分需要被视为“Python”?四、需要多少兼容性才能有用?Python技术资源分享1、Python所有方向的学习路线2、学习软件3、精品书籍4、入门学…

msvcp140.dll丢失的解决方法win7系统,全面详细解析

在Windows 7系统中,msvcp140.dll是一个非常重要的动态链接库文件,它负责许多应用程序和系统的正常运行。然而,由于各种原因,msvcp140.dll文件可能会丢失或损坏,导致系统出现错误提示、程序无法启动等问题。本文将详细介…

QT 布局管理综合实例

通过一个实例基本布局管理,演示QHBoxLayout类、QVBoxLayout类及QGridLayout类效果 本实例共用到四个布局管理器,分别是 LeftLayout、RightLayout、BottomLayout和MainLayout。 在源文件“dialog.cpp”具体代码如下: 运行效果: Se…

《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》阅读笔记

论文标题 《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》 Swin 这个词貌似来自后面的 Shifted WindowsShifted Windows:移动窗口Hierarchical:分层 作者 微软亚洲研究院出品 初读 摘要 提出 Swin Transformer 可以…

【Gradle-12】分析so文件和依赖的关系

1、前言 在包大小的占比中,so文件的占比往往是最高的,动辄几兆的大小多一个都会把包大小的指标打爆。 而在各厂商要求对手机CPU ARM架构进行分包适配的情况下,你更需要知道哪些依赖是没有适配v7a/v8a的,这将影响你的APP在应用市场…

基于SSM的智能物业管理网站的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Scrum Master 如何更好的支持PO?

在过去几年中,和许多Scrum Master交流时,我遇到一个令人担忧的模式。虽然我们有Scrum指南和其他补充资源,许多Scrum Master,特别是刚起步的Scrum Master们,还在日复一日的为如何帮助Product Owner而挣扎着。 以下是我…

C语言--有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。

一.解体思路 设一个结构体数组,数组中包含3个元素; 每个元素中的信息应包括候选人的姓名和得票数;输入被选人的姓名,然后与数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成 员的值加1;输出所有元素的信息。 …

C++ RBTree 理论

目录 这个性质可以总结为 红黑树的最短最长路径 红黑树的路径范围 code 结构 搞颜色 类 插入 插入逻辑 新插入节点 思考:2. 检测新节点插入后,红黑树的性质是否造到破坏? 解决方法 变色 旋转变色 第三种情况,如果根…

聊天机器人框架Rasa资源整理

Rasa是一个主流的构建对话机器人的开源框架,它的优点是几乎覆盖了对话系统的所有功能,并且每个模块都有很好的可扩展性。参考文献收集了一些Rasa相关的开源项目和优质文章。 一.Rasa介绍 1.Rasa本地安装 直接Rasa本地安装一个不好的地方就是容易把本地…

使用电脑时提示msvcp140.dll丢失的5个解决方法

“计算机中msvcp140.dll丢失的5个解决方法”。在我们日常使用电脑的过程中,有时会遇到一些错误提示,其中之一就是“msvcp140.dll丢失”。那么,什么是msvcp140.dll呢?它的作用是什么?丢失它会对电脑产生什么影响呢&…

Docker快速入门

Docker是一个用来快速构建、运行和管理应用的工具。 Docker技术能够避免对服务器环境的依赖,减少复杂的部署流程,有了Docker以后,可以实现一键部署,项目的部署如丝般顺滑,大大减少了运维工作量。 即使你对Linux不熟…

36 Gateway网关 快速入门

3.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…

C++初阶--类与对象(3)(图解)

文章目录 再谈构造函数初始化列表隐式类型转换explicit关键字 static成员友元类内部类匿名对象拷贝函数时的一些优化 再谈构造函数 在我们之前的构造函数中,编译器会通过构造函数,对对象中各个成员给出一个适合的初始值,但这并不能称之为初始…

链表经典面试题之二

今天我们做一道环形链表的题目力扣141题https://leetcode.cn/problems/linked-list-cycle/ 这道题让我们分析链表中是否存环,存在的话返回true,不存在返回false。首先看到这道题我们要捋顺思路,怎么才能达到它要的效果?要找出是否…

Leetcode刷题详解—— 组合总和

1. 题目链接:39. 组合总和 2. 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些…

【网络开发必看】聊聊 Tomcat

文章目录 1. 什么是 Tomcat2. 怎么安装 Tomcat3. Tomcat 的目录结构3.1 bin 目录3.2 conf 目录3.3 lib 目录3.4 log 目录3.5 webapps 目录 4. 启动 Tomcat总结 1. 什么是 Tomcat Tomcat 是一个 HTTP 服务器. 前面学习了 HTTP 协议, 知道了 HTTP 协议就是规定 HTTP 客户端和 HT…

论文笔记:AttnMove: History Enhanced Trajectory Recovery via AttentionalNetwork

AAAI 2021 1 intro 1.1 背景 将用户稀疏的轨迹数据恢复至细粒度的轨迹数据是十分重要的恢复稀疏轨迹数据至细粒度轨迹数据是非常困难的 已观察到的用户位置数据十分稀疏,使得未观察到的用户位置存在较多的不确定性真实数据中存在大量噪声,如何有效的挖…

ffmpeg安装教程(windows、Linux下python环境)

本文旨在向大家介绍ffmpeg在Windows和Linux系统中的安装方法。 目录 一、Windows 安装 ffmpeg1.1 官网下载 ffmpeg 运行程序1.2 环境配置1.3 测试 二、Linux 安装ffmpeg2.1 Linux中安装ffmpeg2.2 python环境安装 ffmpeg2.1.1 为什么要介绍这个2.1.1 成功安装示例 一、Windows …