重学SpringBoot3-日志Logging

news2024/11/24 11:54:36

重学SpringBoot3-日志Logging

  • 引言
  • 默认日志配置
    • 日志门面
    • 如何实现默认配置
  • 自定义日志配置
    • 日志级别
    • 日志分组
    • 日志格式
    • 日志输出
    • 自定义 Logback 配置
    • 切换日志框架
  • 日志使用
    • 方式一:LoggerFactory 获取Logger对象
    • 方式二:引入 lombok
  • 总结

引言

日志记录是任何应用程序开发过程中的一个重要部分,它帮助开发人员了解应用程序的运行状态、诊断问题并进行有效的错误跟踪。SpringBoot3 提供了一个强大的日志管理系统,支持各种日志框架,并提供了简单的配置方法。本教程将介绍 SpringBoot3 中的日志系统,包括默认配置、如何自定义日志设置以及如何使用不同的日志框架。

默认日志配置

日志门面

SpringBoot3 默认是使用 slf4j + Logback 作为默认的日志门面和实现,但也支持其他日志系统,如 Log4j2JUL (Java Util Logging),这是通过所谓的日志门面实现的,开发者可以根据自己的需求选择合适的日志实现框架进行配置。

SpringBoot 中,日志门面是指通过引入日志框架的抽象层来统一管理应用程序中的日志输出。SpringBoot 内置了 Commons LoggingSLF4Jjboss-logging 作为日志抽象层(门面),具体的实现可以是 Log4jJULLog4j2Logback

通过使用日志门面,开发者可以在不改变应用程序代码的情况下,灵活地切换和配置不同的日志实现框架,从而更好地适应不同的部署环境和需求。这样一来,开发者可以更方便地进行日志输出的管理和调整,提高应用程序的可维护性和扩展性。

如何实现默认配置

以导入 spring-boot-starter-web 为例,它会导入 spring-boot-starter

spring-boot-starter

spring-boot-starter 直接引入了 spring-boot-starter-logging 日志相关配配置(而不是通过 XxxAutoConfiguration,这是因为 SpringBoot 启动的时候就要用到日志,需要内置进 SpringBoot 中)。

spring-boot-starter-logging

日志相关文件在这里,可以看到相关的默认配置文件:

spring-boot包下的日志默认配置

另外 spring-bootadditional-spring-configuration-metadata.json 文件下会有日志相关一些默认值的格式,这些默认值可以通过配置文件进行修改。

日志配置默认格式

自定义日志配置

虽然默认配置对于开发时足够使用,但在生产环境中,你可能需要自定义日志设置,例如更改日志级别、格式或输出目的地。

日志级别

默认日志级别:

  • 由低到高:ALL,TRACE, DEBUG, INFO, WARN, ERROR,FATAL,OFF

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

  • SpringBoot3 日志默认级别是 INFO

你可以在 application.ymlapplication.properties 文件中设置不同包的日志级别:

logging:
  level:
    root: WARN
    org.springframework.web: DEBUG
    com.coderjia: INFO

这里,root 级别被设为 WARNSpring web 包日志级别设为 DEBUG,而你自己的公司代码 com.coderjia 设为 INFO 级别。

日志分组

可以将相关的包分组在一起,统一进行日志级别配置配置。比如:Tomcat 相关的日志统一设置。

logging:
  group:
    tomcat: org.apache.catalina,org.apache.coyote,org.apache.tomcat
  level:
    root: debug
    sql: debug
    tomcat: info
    web: info

以上将 org.apache.catalina,org.apache.coyote,org.apache.tomcat 分组为 tomcat,并通过 logging.level.tomcat=infotomcat 组日志级别设置为 info。另外 SpringBoot 预定义两个组 sqlweb

  • web:org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans ;
  • sql:org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener。

日志格式

默认日志格式如下:

2024-03-06T11:30:42.611+08:00  INFO 31412 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8083 (http) with context path ''
2024-03-06T11:30:42.618+08:00  INFO 31412 --- [           main] c.c.b.SpringBoot303LoggingApplication    : Started SpringBoot303LoggingApplication in 1.602 seconds (process running for 2.442)

格式:

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

默认值:可以参照 spring-bootadditional-spring-configuration-metadata.json文件中的 logging.pattern.console 项:

日志输出格式默认值

可修改为:

logging:
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{15} : %msg%n'
    dateformat: '"yyyy-MM-dd HH:mm"'
  • logging.pattern.console :定义输出的格式,
  • logging.pattern.dateformat: 定义输出日期格式。
2024-03-06 11:36:51 INFO  [main] o.s.b.w.e.t.TomcatWebServer : Tomcat started on port 8083 (http) with context path ''

日志输出

默认情况下,日志输出到控制台。但你可以配置它输出到文件或同时输出到文件和控制台:

logging:
  file:
    name: my.log
  	path: /var/logs

这将会在 /var/logs 路径下创建一个 my.log 文件记录日志,logging.file.name=/var/log/my.log 也可以即定义路径又定义名称。

## 日志归档

如果使用 SpringBoot 默认的 Logback 框架,可以通过 application.properties/yaml 文件指定日志归档文件名和滚动规则,如果是其他日志系统,需要自行配置(添加 log4j2.xmllog4j2-spring.xml)。

logging:
  logback:
    rollingpolicy:
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)
      max-file-size: 12MB

配置项如下:

配置项描述
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).

自定义 Logback 配置

对于更高级的配置,例如滚动策略、过滤器等,你可以通过提供自定义的 Logback 配置文件来实现。创建一个名为 logback-spring.xml 的文件,并放在 src/main/resources 目录下:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

这个自定义配置将日志输出格式修改为指定的模式,另外建议自定义配置,配置文件名加上 xxx-spring.xml(例如,logback-spring.xml 而不是 logback.xml),这样更容易被Spring。

切换日志框架

如果你更喜欢使用 Log4j2 而不是 Logback,你可以轻松切换。首先,排除 SpringBoot 的默认日志启动器,然后添加 Log4j2 的依赖:

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

然后,你可以像以前一样配置 Log4j2Spring Boot 会自动识别并应用 Log4j2 的配置。此外如果引入的依赖中自带日志和当前 SpringBoot 默认日志不一致,也可以排查掉依赖中的日志组件。

日志使用

方式一:LoggerFactory 获取Logger对象

在需要打日志的类中定义。

@SpringBootApplication
public class SpringBoot303LoggingApplication {

    private static Logger log = LoggerFactory.getLogger(SpringBoot303LoggingApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(SpringBoot303LoggingApplication.class, args);

        log.info("启动完成");
    }
}

方式二:引入 lombok

使用 @Slf4j 注解可以自动生成一个 log 对象,省去了手动获取 Logger 对象的步骤,简化了代码编写。

导入依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>compile</scope>
</dependency>

添加注接 @Slf4j:

@Slf4j
@SpringBootApplication
public class SpringBoot303LoggingApplication {

    // private static Logger log = LoggerFactory.getLogger(SpringBoot303LoggingApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(SpringBoot303LoggingApplication.class, args);

        log.info("启动完成");
    }
}

总结

SpringBoot3 提供了一个灵活且强大的日志系统,支持多种日志框架和丰富的配置选项。通过适当的配置,你可以轻松管理和监控你的应用程序日志,帮助你更有效地开发和维护你的 SpringBoot 应用。理解和掌握 SpringBoot 中的日志配置,将使你能够更好地控制应用程序的日志记录行为。

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

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

相关文章

记录一则 线上域名证书更新及cdn证书更新

本篇为阿里云免费证书更新记录。 登录阿里云账号 搜索数字证书管理服务管理控制台 点击创建证书 输入你的域名 填写相关信息&#xff08;注&#xff1a;域名验证方式选择文件验证&#xff09; 等待审核通过&#xff08;时间不久&#xff0c;一般为半小时内&#xff09; …

RabbitMQ(三):AMQP协议

目录 1 AMQP协议1.1 AMQP协议介绍1、AMQP是什么2、消息代理中间件的职责 1.2 AMQP 0-9-1模型1、AMQP的工作过程2、交换器和交换器类型3、队列队列属性队列名称队列持久化 1.3 几个概念1、绑定2、消费者3、消息确认4、预取消息5、消息属性和有效载荷&#xff08;消息主体&#x…

leetcode 经典题目42.接雨水

链接&#xff1a;https://leetcode.cn/problems/trapping-rain-water 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 思路分析 首先&#xff0c;我们需要遍历数组&#xff0c;对于每个元素&am…

探秘C语言:如何轻松求解正整数公因子个数?

本篇博客会讲解力扣“2427. 公因子的数目”的解题思路&#xff0c;这是题目链接。 本题的思路是&#xff1a; 由于a和b公因子的个数就是a和b的最大公约数的因子的个数&#xff0c;所以我们需要思考以下2个问题&#xff1a; 如何求解最大公约数&#xff1f;如何求解正整数的因…

性能测试总结 —— 基础理论篇!

随着软件行业的快速发展&#xff0c;现代的软件系统越来越复杂&#xff0c;功能越来越多&#xff0c;测试人员除了需要保证基本的功能测试质量&#xff0c;性能也随越来越受到人们的关注。但是一提到性能测试&#xff0c;很多人就直接连想到Loadrunner。认为LR就等于性能测试&a…

事件流、事件捕获、事件冒泡、事件委托

一、事件流 事件流指的是事件完整执行过程中的流动路径&#xff0c;分为捕获阶段、冒泡阶段。如上图 二、事件捕获 当一个元素的事件被触发时&#xff0c;会从DOM的根元素开始&#xff0c;依次调用同名事件&#xff08;从外到里&#xff0c;从父到子&#xff09;。 DOM.addEve…

【MySQL】数据库设计

目录 数据库设计基本任务 软件项目开发周期中数据库设计数据库设计的基本步骤解释需求分析需求分析的三个步骤&#xff1a;1.需求调查:2.分析数据字典内容定义数据的方法案例 3. 评审 概念结构设计概念模型概念结构设计E-R图概念模型组成元素&#xff1a;关系解释案例分析 逻辑…

网络安全: Kali Linux 进行 SSH 渗透与防御

目录 一、实验 1.环境 2.nmap扫描目标主机 3.Kali Linux 进行 SSH 渗透 3.Kali Linux 进行 SSH 防御 二、问题 1.SSH有哪些安全配置 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本IP备注Kali Linux2022.4 192.168.204.154&#xff08;动态&…

基于springboot+vue的农商对接系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

110. 平衡二叉树【简单】

110. 平衡二叉树【简单】 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a;r…

Vivado HLS学习笔记

任意精度的数据类型 u 代表 unsigned&#xff0c;fixed代表定点数据&#xff0c;即常数 采用任意精度的数据类型可以使用更少的资源&#xff0c;硬件友好性 数据类型定义在 header file 中 表示任意进制 ap_int<6> a("101010",2); //二进制数据101010 ap_in…

DR模式下部署LVS负载均衡集群的详细原理

目录 一、LVS-DR模式 1、基本原理 2、数据包流向分析 二、LVS-DR中的ARP问题 三、LVS-DR 特点 3.1 DR模式的特点 3.2 LVS-DR的优缺点 四、RS设置lo:0而不设置ens33:0的原因 一、LVS-DR模式 1、基本原理 Director Server作为群集的访问入口&#xff0c;但不作为网关使…

【C++实战项目】Date日期类 --- 运算符重载的深入探索

&#x1f4f7; 江池俊&#xff1a;个人主页 &#x1f525; 个人专栏&#xff1a;✅C那些事儿 ✅Linux技术宝典 &#x1f305; 此去关山万里&#xff0c;定不负云起之望 文章目录 引言一、为什么需要运算符重载&#xff1f;二、日期类的实现1. 基本框架2. 预备工作3. Date 类…

【MySQL】数据库的操作(1)

【MySQL】数据库的操作&#xff08;1&#xff09; 目录 【MySQL】数据库的操作&#xff08;1&#xff09;创建数据库数据库的编码集和校验集查看系统默认字符集以及校验规则查看数据库支持的字符集查看数据库支持的字符集校验规则校验规则对数据库的影响数据库的删除 数据库的备…

预算有限,3D渲染更该升级显卡还是CPU?升级电脑配置推荐!

在当今数字化时代&#xff0c;影视、游戏和效果图设计等领域都需要强大的计算机来支持3D渲染工作。受当前国际和市场环境影响&#xff0c;硬件价格持续上涨&#xff0c;有专家预测这种局面将至少持续半年以上。因此&#xff0c;在预算有限的情况下&#xff0c;很多设计师在电脑…

Spring Cloud Gateway核心之Predicate

路由 Predicate 工厂 Spring Cloud Gateway 将路由作为 Spring WebFluxHandlerMapping基础设施的一部分进行匹配。Spring Cloud Gateway 包含许多内置的路由Predicate 工厂。所有这些谓词都匹配 HTTP 请求的不同属性。多个 Route Predicate Factory 可以组合&#xff0c;并通过…

【VTKExamples::PolyData】第四十八期 ShrinkPolyData

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例ShrinkPolyData,并解析接口vtkShrinkPolyData,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. ShrinkPol…

基于RFID技术+WMS仓储管理应用设计

一、项目背景 1.1 背景 仓储管理是企业对仓库及其内部物资进行计划、组织、控制和协调的管理过程。它在整个物流和经济活动中扮演着重要的角色&#xff0c;连接着生产者和消费者。 不同规模和产品种类的企业有不同的仓储管理流程和需求&#xff0c;但核心部分都包括仓库作业…

vue+uniapp实现图形验证码功能-插件(附源码)

一、需求背景 vueuniapp实现图形验证码功能-插件&#xff08;附源码&#xff09; 在登录系统时&#xff0c;除了密码登录&#xff0c;还需要提供验证码登录。 涉及验证码&#xff0c;为了安全&#xff0c;一般会加入图形验证码&#xff0c;然后再发短信验证码。 如图&#xff1…

springboot236基于springboot在线课程管理系统的设计与实现

基于SpringBoot在线课程管理系统的设计与实现 摘要 本文首先介绍了在线课程管理系统的现状及开发背景&#xff0c;然后论述了系统的设计目标、系统需求、总体设计方案以及系统的详细设计和实现&#xff0c;最后对在线课程管理系统进行了系统检测并提出了还需要改进的问题。本系…