SpringBoot 日志

目录

一. 日志概述

二. 日志的使用

1. 打印日志

(1) 获取日志对象

(2) 输出要打印的内容

2. 日志框架简介

(1) 门面模式简介

(2) SLF4J 框架简介

3. 日志的格式

4. 日志的级别

5. 日志配置

(1) 配置日志级别

(2) 日志持久化存储

① 配置日志文件名

② 配置日志的存储目录

(3) 日志文件分割

(4) 更简单的日志输出


一. 日志概述

日志对我们来说并不陌生, 从JavaSE部分开始, 我们就在使用 System.out.print 来打印日志了. 通过打印日志来发现和定位问题, 或者根据日志来分析程序的运行过程. 在Spring的学习中, 我们也经常根据控制台的日志来分析和定位问题.

随着项目的复杂度提升, 我们对日志的打印也有了更高的需求, 不仅仅是定位排查问题.

比如 记录一些用户的操作记录; 使用日志来记录用户的一些喜好; 把日志持久化, 后续进行数据分析等. 但是 System.out.print 不能很好的满足我们的需求, 此时我们就需要引入一些专门的日志框架来完成这样的任务.

二. 日志的使用

1. 打印日志

打印日志的步骤:

step1: 从程序中获取日志对象.

step2: 使用日志对象输出要打印的内容.

(1) 获取日志对象

在程序中获取日志对象需要使用日志工厂 LoggerFactory, 如下代码所示:

package com.jrj.logger;

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

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

[注意]:

① Logger 对象是属于 org.slf4j 包下的, 不要导错包. 

② LoggerFactory.getLogger 需要传递一个参数. 参数类型是一个类对象, 传入的是哪个类的类对象, 就表示哪个类在打印日志.

(2) 输出要打印的内容

日志对象的打印方法有很多种, 我们这里先使用 logger.info() 方法打印.

@RestController
public class LoggerController {
    public static Logger logger = LoggerFactory.getLogger(LoggerController.class);
    @RequestMapping("/printLogger")
    public static String printLogger(){
        logger.info("打印日志");
        return "打印日志";
    }
}

打印结果如下: 

2. 日志框架简介

SLF4J不同于其他日志框架. 它并不是一个真正的日志实现, 而是一个抽象层, 一种接口. 所有SLF4J并不能独立使用, 需要和具体的更底层的日志框架配合使用.

(1) 门面模式简介

门面模式又称为外观模式. 提供了一个统一的接口, 用来访问子系统中的一群接口. 其主要特征是 定义了一个高层接口, 让子系统更容易使用.

 

(2) SLF4J 框架简介

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

存在的问题:

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

 

3. 日志的格式

通过打印出的日志我们可以看到, 日志内容从左到右依次为:

① 日期, 时间 (精确到毫秒)

② 日志级别

③ 进程ID

④ 打印日志的项目名

⑤ 线程名

⑥ Logger 名

⑦ 日志内容

 

4. 日志的级别

日志级别代表着日志信息对应问题的严重性, 方便更快地筛选符合目标的日志信息.

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

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

[注]: 一般情况下, 日志级别越高, 收到的消息越少.

例如: 出现fatal级别的日志, 表示服务器出现了某种程度上的不可用, 需要程序员紧急介入处理, 一般在一个程序的生命周期中fatal级别的日志只会出现一次

我们下来打印一下不同级别的日志观察一下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/logger")
public class LoggerController {
    public static Logger logger = LoggerFactory.getLogger(LoggerController.class);
    @RequestMapping("/printLogger")
    public static String printLogger(){
        logger.info("打印info日志");
        logger.error("打印error日志");
        logger.warn("打印warn日志");
        logger.debug("打印debug日志");
        logger.trace("打印trace日志");
        return "打印日志";
    }
}

从打印结果我们可以看到: 只打印出了 INFO, WARN, ERROR 级别的日志. 却没有打印出 DEBUG 和 TRACE 级别的日志. 这是因为日志的输出默认最低级别是 INFO 级别, 也就是说, 级别低于INFO的都不会打印出来.

5. 日志配置

(1) 配置日志级别

日志的级别配置只需要在配置文件中设置 "logging.level" 配置项即可.

properties:

logging.level.root=debug

yml:

logging:
  level:
    root: debug

运行后效果: 

 

后续我们在项目中配置日志级别时, properties 和 yml 只需要配置其中的一个即可. 

root 表示的是该项目下的所有文件的日志. 我们也可以通过 在level下面加上软件包的树形结构 来限定 只有指定包下文件的日志从指定级别开始打印.

logging.level.org.example.practice.LoggerController=trace

 

(2) 日志持久化存储

以上的日志都是输出在控制台的 (日志存在内存中), 但是我们有时需要持久存储日志 (将日志存到硬盘中) 以便出现问题之后追溯问题. 那如何持久化存储日志呢? --> 日志的持久化存储有两种方式

① 配置日志文件名
# 设置⽇志⽂件的⽂件名
logging:
  file:
    name: logger/springboot.log

 

② 配置日志的存储目录
# 设置⽇志⽂件的⽬录
logging:
  file:
    path: F:/temp

配置好后, 运行程序, 会发现指定路径下多出一个文件.

  • 配置日志文件的存储路径, 可以是相对路径, 可以是绝对路径. 路径中只可以设置路径(不能设置文件名称).
  • logging.file.name 和 logging.file.path 两者都配置的情况下, 只生效一个 (以 logging.file.name 为准)

(3) 日志文件分割

如果我们的日志都放在一个文件中, 随着项目的运行, 日志文件就会越来越大. 此时我们就需要对日志文件进行分割.

当然日志框架也考虑到了这一点. 所以我们如果不手动分割的话, 就会自动进行分割 (默认日志文件大小超过10M就进行分割).

logging:
  logback:
    rollingpolicy:
      max-file-size: 2KB
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i

上述代码中的配置表示: ① 最大日志文件大小为2KB (大小超过2KB就分割) ; ② 分割后的日志文件名为: 日志名. 日期. 索引 

将上述代码运行, 并且多打印几次日志, 我们得到:

(4) 更简单的日志输出

每次都使用LoggerFactory很繁琐,每个类都要添加一遍Logger对象,于是lombok就为我们提供了一种特别方便的方式.

  1. 添加lombok依赖.
  2. 使用 @Slf4j注解.

@Slf4j 注解产生Logger对象(对象名默认为log). 使用log对象进行日志输出. 

@RestController
@Slf4j
public class LoggerController {

    public static String printLogger(){
        log.info("打印info日志");
        log.error("打印error日志");
        log.warn("打印warn日志");
        log.debug("打印debug日志");
        log.trace("打印trace日志");
        return "打印日志";
    }
}

通过结果我们可以看到, 同样可以正常打印日志.

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

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

相关文章

Python 梯度下降法(一):Gradient Descent

文章目录 Python 梯度下降法(一):Gradient Descent一、原理1.1 多元函数1.2 梯度下降法 二、常见的梯度公式2.1 标量对向量的梯度2.2 向量对向量的梯度2.3 向量对标量的梯度2.4 标量对矩阵的梯度 三、常见梯度算法3.1 Batch Gradient Descent…

从AD的原理图自动提取引脚网络的小工具

这里跟大家分享一个我自己写的小软件,实现从AD的原理图里自动找出网络名称和引脚的对应。存成文本方便后续做表格或是使用简单行列编辑生成引脚约束文件(如.XDC .UCF .TCL等)。 我们在FPGA设计中需要引脚锁定文件,就是指示TOP层…

【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)

文章目录 【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)1. JDK介绍2. 下载 JDK3. 安装 JDK4. 配置环境变量5. 验证安装6. 创建并测试简单的 Java 程序6.1 创建 Java 程序:6.2 编译和运行程序:6.3 在显示或更改文件的…

WGCLOUD服务器资源监控软件使用笔记 - Token is error是什么错误

[wgcloud-agent]2025/01/30 10:41:30 WgcloudAgent.go:90: 主机监控信息上报server开始 [wgcloud-agent]2025/01/30 10:41:30 WgcloudAgent.go:99: 主机监控信息上报server返回信息: {"result":"Token is error"} 这个错误是因为agent配置的wgToken和serv…

MySQL(表空间)

​开始前先打开此图配合食用 MySQL表空间| ProcessOn免费在线作图,在线流程图,在线思维导图 InnoDB 空间文件中的页面管理 后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都…

白嫖DeepSeek:一分钟完成本地部署AI

1. 必备软件 LM-Studio 大模型客户端DeepSeek-R1 模型文件 LM-Studio 是一个支持众多流行模型的AI客户端,DeepSeek是最新流行的堪比GPT-o1的开源AI大模型。 2. 下载软件和模型文件 2.1 下载LM-Studio 官方网址:https://lmstudio.ai 打开官网&#x…

知识管理平台在数字经济时代推动企业智慧决策与知识赋能的路径分析

内容概要 在数字经济时代,知识管理平台被视为企业智慧决策与知识赋能的关键工具。其核心作用在于通过高效地整合、存储和分发企业内部的知识资源,促进信息的透明化与便捷化,使得决策者能够在瞬息万变的市场环境中迅速获取所需信息。这不仅提…

关于MySQL InnoDB存储引擎的一些认识

文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的?1.1 MySQL的存储引擎有哪些?1.2 MyIsam和InnoDB有什么区别? 2.MySQL表的结构是什么?2.1 行结构是什么样呢?2.1.1 NULL列表?2.1.2 char和varc…

【开源免费】基于SpringBoot+Vue.JS公交线路查询系统(JAVA毕业设计)

本文项目编号 T 164 ,文末自助获取源码 \color{red}{T164,文末自助获取源码} T164,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

【Unity3D】实现横版2D游戏角色二段跳、蹬墙跳、扶墙下滑

目录 一、二段跳、蹬墙跳 二、扶墙下滑 一、二段跳、蹬墙跳 GitHub - prime31/CharacterController2D 下载工程后直接打开demo场景:DemoScene(Unity 2019.4.0f1项目环境) Player物体上的CharacterController2D,Mask添加Wall层…

讯飞智作 AI 配音技术浅析(二):深度学习与神经网络

讯飞智作 AI 配音技术依赖于深度学习与神经网络,特别是 Tacotron、WaveNet 和 Transformer-TTS 模型。这些模型通过复杂的神经网络架构和数学公式,实现了从文本到自然语音的高效转换。 一、Tacotron 模型 Tacotron 是一种端到端的语音合成模型&#xff…

初始化mysql报错cannot open shared object file: No such file or directory

报错展示 我在初始化msyql的时候报错:mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 解读: libaio包的作用是为了支持同步I/O。对于数据库之类的系统特别重要,因此…

DeepSeek介绍

目录 前言 1.介绍一下你自己 2.什么是CUDA CUDA的核心特点: CUDA的工作原理: CUDA的应用场景: CUDA的开发工具: CUDA的局限性: 3.在AI领域,PTX是指什么 1. PTX 的作用 2. PTX 与 AI 的关系 3. …

python学opencv|读取图像(五十一)使用修改图像像素点上BGR值实现图像覆盖效果

【1】引言 前序学习了图像的得加方法,包括使用add()函数直接叠加BGR值、使用bitwise()函数对BGR值进行按位计算叠加和使用addWeighted()函数实现图像加权叠加至少三种方法。文章链接包括且不限于: python学opencv|读取图像(四十二&#xff…

【硬件介绍】三极管工作原理(图文+典型电路设计)

什么是三极管? 三极管,全称为双极型晶体三极管,是一种广泛应用于电子电路中的半导体器件。它是由三个掺杂不同的半导体材料区域组成的,这三个区域分别是发射极(E)、基极(B)和集电极&…

【解决方案】MuMu模拟器移植系统进度条卡住98%无法打开

之前在Vmware虚拟机里配置了mumu模拟器,现在想要移植到宿主机中 1、虚拟机中的MuMu模拟器12-1是目标系统,对应的目录如下 C:\Program Files\Netease\MuMu Player 12\vms\MuMuPlayer-12.0-1 2、Vmware-虚拟机-设置-选项,启用共享文件夹 3、复…

C++中常用的十大排序方法之1——冒泡排序

成长路上不孤单😊😊😊😊😊😊 【😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C中常用的排序方法之——冒泡排序的相关…

开源2+1链动模式AI智能名片S2B2C商城小程序:利用用户争强好胜心理促进分享行为的策略研究

摘要:随着互联网技术的快速发展和社交媒体的普及,用户分享行为在企业营销中的作用日益凸显。本文旨在探讨如何利用用户的争强好胜心理,通过开源21链动模式AI智能名片S2B2C商城小程序(以下简称“小程序”)促进用户分享行…

DeepSeek-R1环境搭建推理测试

引子 这两天国货之光DeepSeek-R1火爆出圈,凑个热闹。过来看看 aha moment(顿悟时刻)的神奇,OK,我们开始吧。 一、模型介绍 1月20日,中国AI公司深度求索(DeepSeek)发布的DeepSeek-…

【深度分析】微软全球裁员计划不影响印度地区,将继续增加当地就业机会

当微软的裁员刀锋掠过全球办公室时,班加罗尔的键盘声却愈发密集——这场资本迁徙背后,藏着数字殖民时代最锋利的生存法则。 表面是跨国公司的区域战略调整,实则是全球人才市场的地壳运动。微软一边在硅谷裁撤年薪20万美金的高级工程师&#x…