SpringBoot整合日志功能(slf4j+logback)详解

news2024/11/15 11:39:20

 

目录

一、日志门面与日志实现

1.1 什么是日志门面和日志实现?

1.2 为什么需要日志门面?

二、简介

三、日志格式

四、记录日志

4.1 使用日志工厂

4.2 使用Lombok的@Slf4j注解

五、日志级别

5.1 日志级别介绍

5.2 配置日志级别

5.3 指定某个包下的类使用某个级别

5.4 占位符打印

六、日志分组

七、文件输出

八、文件归档与滚动切割

九、自定义配置

十、切换日志组合


一、日志门面与日志实现

1.1 什么是日志门面和日志实现?

日志门面相当于JDBC接口,而日志实现类似于Mysql、Oracle、SqlServer等。

在Java生态体系中,围绕着日志,有很多成熟的解决方案。关于日志输出,主要有两类工具。

一类是日志框架(Log4j、Logback),主要用来进行日志的输出的,比如输出到哪个文件,日志格式如何等。另 外一类是日志门面(slf4j,commons-logging),主要一套通用的API,用来屏蔽各个日志框架之间的差异的。

对于Java工程师来说,关于日志工具的使用,最佳实践就是在应用中使用如Log4j + SLF4J这样的组合来进行日志 输出。

这样做的最大好处,就是业务层的开发不需要关心底层日志框架的实现及细节,在编码的时候也不需要考虑日后更 换框架所带来的成本。这也是门面模式所带来的好处。

1.2 为什么需要日志门面?

前面提到过一个重要的原因,就是为了在应用中屏蔽掉底层日志框架的具体实现。这样的话,即使有一天要更换代 码的日志框架,只需要修改jar包,最多再改改日志输出相关的配置文件就可以了。这就是解除了应用和日志框架 之间的耦合。

有人或许会问了,如果我换了日志框架了,应用是不是就改了,那日志门面不还是需要改的吗?

要回答这个问题,我们先来举一个例子,再把门面模式碎了重新解释一遍。

日志门面就像饭店的服务员,而日志框架就像是后厨的厨师。对于顾客这个应用来说,我到饭店点菜,我只需要告 诉服务员我要一盘番茄炒鸡蛋即可,我不关心他后厨的所有事情。因为虽然主厨从把这道菜称之为「番茄炒蛋」的厨师 换成了把这道菜称之为「西红柿炒鸡蛋」的厨师。但是,顾客不需要关心,他只要下达「番茄炒蛋」的命令给到 服务员,由服务员再去翻译给厨师就可以了。

所以,对于一个了解了「番茄炒蛋」的多种叫法的服务员来说,无论后厨如何换厨师,他都能准确的帮用户下单。

同理,对于一个设计的全面、完善的日志门面来说,他也应该是无缝兼容了多种日志框架的。所以,底层框架的 更换,日志门面几乎不需要改动。

以上,就是日志门面的一个比较重要的好处——解耦。

二、简介

  1. Spring使用commons-logging作为内部日志,但底层日志实现是开放的。可对接其他日志框架。spring5及以后 commons-logging被spring直接自己写了。
  2. 支持 jul,log4j2,logback。SpringBoot 提供了默认的控制台输出配置,也可以配置输出为文件。
  3. logback是默认使用的。
  4. 虽然日志框架很多,但是我们不用担心,使用 SpringBoot 的默认配置就能工作的很好

SpringBoot怎么把日志默认配置好的?

  1. 每个starter场景,都会导入一个核心场景spring-boot-starter
  2. 核心场景引入了日志的所用功能spring-boot-starter-logging
  3. 默认使用了slf4j + logback 组合作为默认底层日志
  4. 日志是系统一启动就要用,而xxxAutoConfiguration是系统启动好了以后放好的组件,后来用的。
  5. 日志是利用监听器机制配置好的。ApplicationListener
  6. 日志所有的配置都可以通过修改配置文件实现。以logging开始的所有配置。

三、日志格式

2023-03-31T13:56:17.511+08:00  INFO 4944 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-03-31T13:56:17.511+08:00  INFO 4944 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.7]

默认输出格式:

  • 时间和日期:毫秒级精度
  • 日志级别:ERROR, WARN, INFO, DEBUG, or TRACE.
  • 进程 ID
  • ---: 消息分割符
  • 线程名: 使用[]包含
  • Logger 名: 通常是产生日志的类名
  • 消息: 日志记录的内容

注意: logback 没有FATAL级别,对应的是ERROR

默认值:参照:spring-bootadditional-spring-configuration-metadata.json文件

默认输出格式值:%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}

在application.properties可修改为:

%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n

启动项目发现日志变成我们修改的样子了。

四、记录日志

4.1 使用日志工厂

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

@RestController
public class HelloController {

    Logger log = LoggerFactory.getLogger(getClass());

    @GetMapping("/hello")
    public String hello(){
        log.info("方法进来了...");
        return "Hello,Spring Boot 3!";
    }

}

4.2 使用Lombok的@Slf4j注解

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

@Slf4j
@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        log.info("方法进来了...");
        return "Hello,Spring Boot 3!";
    }

}

五、日志级别

5.1 日志级别介绍

  • 由低到高:ALL,TRACE, DEBUG, INFO, WARN, ERROR,FATAL,OFF
    • 只会打印指定级别及以上级别的日志
    • ALL:打印所有日志
    • TRACE:追踪框架详细流程日志,一般不使用
    • DEBUG:开发调试细节日志
    • INFO:关键、感兴趣信息日志
    • WARN:警告但不是错误的信息日志,比如:版本过时
    • ERROR:业务错误日志,比如出现各种异常
    • FATAL:致命错误日志,比如jvm系统崩溃
    • OFF:关闭所有日志记录
  • 不指定级别的所有类,都使用root指定的级别作为默认级别
  • SpringBoot日志默认级别是 INFO

也就是说,如果你配置文件没有配置日志级别,那么默认级别是info,打印的也是info顺序后面的日志级别,包括info、warn、error、fatal、off等。

5.2 配置日志级别

application.properties中配置:

logging.level.root = debug

这样配置代表以后debug及以后级别的日志都可以打印。

5.3 指定某个包下的类使用某个级别

logging.level.com.atguigu.controller=debug

代表只有com.atguigu.controller包使用debug级别,其余都使用默认info级别。

5.4 占位符打印

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

@Slf4j
@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(String a, String b){
        log.info("info日志:参数a:{} 参数b:{}", a, b);
        return "Hello,Spring Boot 3!";
    }

}

六、日志分组

有这么一种场景,比如我的包很多,这些包都想设置debug级别,那么配置如下:

logging.level.com.atguigu.controller=debug
logging.level.com.atguigu.service=debug
logging.level.com.atguigu.dao=debug
logging.level.com.atguigu.entity=debug
logging.level.com.atguigu.common=debug
...

这样当包有很多的时候,写起来很麻烦!!!那么有什么办法呢?没错,就是分组。

比如我把这些包分成一个组,组名叫abc,配置如下:

logging.group.abc=com.atguigu.controller,com.atguigu.service,com.atguigu.dao,com.atguigu.entity,com.atguigu.common
logging.level.abc=debug

这样不就简便很多了吗?

七、文件输出

SpringBoot 默认只把日志写在控制台,如果想额外记录到文件,可以在application.properties中添加logging.file.name or logging.file.path配置项。

logging.file.name

logging.file.path

示例

效果

未指定

未指定

仅控制台输出

指定

未指定

my.log

写入指定文件。可以加路径

未指定

指定

/var/log

写入指定目录,文件名为spring.log

指定

指定

以logging.file.name为准

例:将日志打印在D盘的/logs/my.log中

logging.file.name=D:/logs/my.log

八、文件归档与滚动切割

比如我们将项目的日志打印到D:\\my.log中,那么时间短还行,如果持续一年,我们的日志文件将会非常大,打开都会崩的状态。

归档:每天的日志单独存到一个文档中。

切割:每个文件10MB,超过大小切割成另外一个文件。

  1. 每天的日志应该独立分割出来存档。如果使用logback(SpringBoot 默认整合),可以通过application.properties/yaml文件指定日志滚动规则。
  2. 如果是其他日志系统,需要自行配置(添加log4j2.xml或log4j2-spring.xml)
  3. 支持的滚动规则设置如下

配置项

描述

logging.logback.rollingpolicy.file-name-pattern

日志存档的文件名格式(默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)

logging.logback.rollingpolicy.clean-history-on-start

应用启动时是否清除以前存档(默认值:false)

logging.logback.rollingpolicy.max-file-size

存档前,每个日志文件的最大大小(默认值:10MB)

logging.logback.rollingpolicy.total-size-cap

日志文件被删除之前,可以容纳的最大大小(默认值:0B)。设置1GB则磁盘存储超过 1GB 日志后就会删除旧日志文件

logging.logback.rollingpolicy.max-history

日志文件保存的最大天数(默认值:7).

例:

logging.file.name=D:\logs\my.log
# LOG_FILE:代表我们配置的日志文件名,如my.log
# yyyy-MM-dd:年月日
# %i:代表当天第几个文件
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
# 只要my.log日志文件大于10MB就会触发日志归档,将当前日志文件压缩为my.log.2019-01-01.1.gz
logging.logback.rollingpolicy.max-file-size=10MB

九、自定义配置

通常我们配置 application.properties 就够了。当然也可以自定义。比如:

日志系统

自定义

Logback

logback-spring.xml, logback-spring.groovy,

logback.xml, or logback.groovy

Log4j2

log4j2-spring.xml or log4j2.xml

JDK (Java Util Logging)

logging.properties

如果可能,我们建议您在日志配置中使用-spring 变量(例如,logback-spring.xml 而不是 logback.xml)。如果您使用标准配置文件,spring 无法完全控制日志初始化。

最佳实战:自己要写配置,配置文件名加上 xx-spring.xml

十、切换日志组合

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

哪怕你切换log4j2,你也不用改任何代码和配置,这就是日志门面的好处。

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

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

相关文章

SpringBoot配置--Profile

目录 使用profile 的原因&#xff1f; proflie 的配置方式 多profile文件方式 profile 激活方式 1 配置文件 2 命令行参数 小结 使用profile 的原因&#xff1f; 用来完成不同环境下&#xff0c;配置动态切换功能的&#xff08;具体什么意思呢&#xff1f;假设你在A电脑…

【算法速刷(8/100)】LeetCode —— 21.合并两个有序链表

使用两个指针顺序遍历两个链表&#xff0c;每次都将最小值的那个加到结果链表上&#xff0c;最后如果两个链表不一样长&#xff0c;就将剩下的接到结果后面 无头结点 无头结点的情况下&#xff0c;处处都需要进行判空&#xff0c;将初次赋值和其他时候分为两个情况&#xff0c…

cloud compare二次插件化功能开发详细步骤(一)

点云处理&#xff0c;有一个出名的处理软件&#xff0c;cloud compare&#xff0c;简称cc&#xff0c;将自己实现的功能以插件形式集成到CC里&#xff0c;方便使用 前提 环境&#xff1a;cc 2.13&#xff0c;qt 5.15&#xff0c;cmake 3.18&#xff0c;vs2019【其他组合也可&…

二、AI工作流(低代码)的趋势崛起在即。带你轻松玩转输入-文本组件

对工作流感兴趣的小伙伴可以去试一试。&#x1f525;偷偷的告诉你&#xff0c;它的GPTo4.0不要&#x1f4b0;。传送门&#xff1a;https://www.nyai.chat/chat?invitenyai_1141439 一、能用AI工作流介绍 能用AI-工作流是一个“低代码”工具、它也是个人或者中小企业的提效工…

8G显存玩转书生大模型

基础任务 使用 Cli Demo 完成 InternLM2-Chat-1.8B 模型的部署&#xff0c;并生成 300 字小故事&#xff0c;记录复现过程并截图。 尝试很多方法无解后在网页端重新输入&#xff1a; import torch from transformers import AutoTokenizer, AutoModelForCausalLM使用了Tran…

sql注入(判断字符型/数字型)

目录 字符型 数字型 字符型闭合方式 less-1 less-4 sql注入常见类型包括字符型和数字型&#xff08;json这里不介绍&#xff09; 以sql-labs靶场为例&#xff1b; 字符型 less-1&#xff1a;输入参数id&#xff1a; 这里我将sql查找语句一起输出了&#xff1b; 我们发现…

书生大模型实战营-基础关-XTuner 微调个人小助手认知

XTuner 微调个人小助手认知 环境配置模型效果预览微调数据准备微调配置微调训练权重格式转换模型合并页面对话 环境配置 # 创建虚拟环境 conda create -n xtuner0812 python3.10 -y# 激活虚拟环境&#xff08;注意&#xff1a;后续的所有操作都需要在这个虚拟环境中进行&#…

锂电池剩余寿命预测 | Matlab基于LSTM-Attention的锂电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于LSTM-Attention的锂电池剩余寿命预测&#xff08;单变量&#xff09;&#xff0c;长短期记忆神经网络融合注意力机制&#xff08;自注意力机制&#xff0c;多头注意力机制&#xff09;&#xff08;单变量&…

有效字的字母异位词

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输…

8.14-LVS主从+nginx的haproxy+mysql的haproxy+读写分离

一、LVS-主从数据库 # nat # 添加规则 [rootDS ~]# ipvsadm -A -t 192.168.2.130:3306 -s rr [rootDS ~]# ipvsadm -a -t 192.168.2.130:3306 -r 192.168.2.40:3306 -m [rootDS ~]# ipvsadm -a -t 192.168.2.130:3306 -r 192.168.2.42:3310 -m [rootDS ~]# ipvsadm -Ln IP Vir…

javaweb学习笔记(8.10)

一、JS 1.1JS简介 Web标准&#xff1a;由3WC制订 三个组成部分&#xff1a; HTML---》网页的基础结构 CSS---》网页的表现效果 JavaScript---》网页的行为 简介&#xff1a;JS是一门跨平台、面向对象的脚本语言。用来控制网页行为的&#xff0c;使网页交互。 1.2JS的引入…

贷奇乐漏洞学习 --- 两个变态WAF绕过

代码分析 第一个WAF 代码 function dowith_sql($str) {$check preg_match(/select|insert|update|delete|\|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/is, $str);if ($check) {echo "非法字符!";exit();}return $str;} 实现原理 这段PHP代码定义了一个…

Linux日常运维-主机名hosts

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 本小章内容就是Linux进阶部分的日常运维部分&#xff0c;掌握这些日常运维技巧或者方法在我们的日常运维过程中会带来很多方…

探索消费新纪元:循环购模式的奥秘

在这个日新月异的消费时代&#xff0c;你是否听说过“消费1000送2000&#xff0c;每天领钱&#xff0c;提现无忧”的奇闻&#xff1f;或许你会疑惑&#xff0c;商家这是在慷慨解囊&#xff0c;还是在布下什么神秘的局&#xff1f;今天&#xff0c;让我作为你的私域电商向导&…

Linux应用--IO多路复用

一、I/O多路复用简介 socket通信&#xff0c;在Linux系统其是就是文件描述符&#xff0c;对应于内核中的缓冲区&#xff08;包含读缓冲区与写缓冲区&#xff09;&#xff0c;实质上是对读写缓冲区的操作&#xff1b;多路复用&#xff0c;多条路复用成一条路。 I/O多路复用使得程…

爬虫动态http代理ip:提高数据抓取的有效工具

爬虫动态HTTP代理IP的概述与应用 在网络爬虫的世界中&#xff0c;动态HTTP代理IP是一个非常重要的工具。它不仅能帮助用户提高数据抓取的效率&#xff0c;还能有效避免被目标网站封禁。本文将为您详细介绍什么是动态HTTP代理IP、其优势、使用场景及如何获取和配置。 1. 什么是…

NVDLA专题8:具体模块介绍——Convolution Accumulator

概述 卷积累加器(Convolution Accumulator&#xff0c; CACC)是CMAC之后的卷积流水线的一个阶段,CACC的定义在NV_NVDLA_cacc.v&#xff0c;module定义如下&#xff1a; module NV_NVDLA_cacc (cacc2sdp_ready //|< i,csb2cacc_req_pd //|<…

ZooKeeper服务器下载|安装|配置|启动|关闭|端口占用冲突解决

1、下载ZooKeeper ZooKeeper官网&#xff1a;https://zookeeper.apache.org/ 下载ZooKeeper二进制包 2、安装ZooKeeper 对ZooKeeper压缩包解压即可 tar -zxvf apache-zookeeper-3.9.2-bin.tar.gz -C /usr/local/3、配置ZooKeeper 来到ZooKeeper配置文件页面 cd conf复制z…

一文详解ETC1压缩纹理——OpenGL中ETC1纹理加载与渲染实践

ETC1(Ericsson Texture Compression)是一种有损纹理压缩技术,2005年初由爱立信研究院参与研发,目的是用于减少移动设备和嵌入式系统中纹理存储的内存占用,应用场景见于游戏、VR、AR等需要大量的纹理资源来创建高质量的视觉效果以及复杂的动画效果场景。 ETC1可提供RGB888像…

宠物医院收银系统源码

1.系统开发语言 核心开发语言: PHP、HTML5、Dart 后台接口: PHP7.3 后合管理网站: HTML5vue2.0element-uicssjs 线下收银台&#xff08;安卓/Windows版&#xff09;: Dart3 框架&#xff1a;Flutter 3.19.6 助手: uniapp 商城: uniapp 2.系统概况 针对宠物医院的一套一体化收…