重学SpringBoot3-日志Logging

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学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: WARNorg.springframework.web: DEBUGcom.coderjia: INFO

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

日志分组

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

logging:group:tomcat: org.apache.catalina,org.apache.coyote,org.apache.tomcatlevel:root: debugsql: debugtomcat: infoweb: 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.logpath: /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.mzph.cn/news/739966.shtml

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

相关文章

数据结构 - 链表 (四)

这篇博客将介绍带头循环的双向链表&#xff0c;实现链表的头部插入/删除&#xff0c;尾部插入/删除&#xff0c;查找&#xff0c;以及任意位置的插入删除。 1.结构 带头循环的双向链表的结构如下图所示&#xff0c;一个结点内部包含数据&#xff0c;以及分别指向前一个以及后…

LabVIEW质谱仪开发与升级

LabVIEW质谱仪开发与升级 随着科技的发展和实验要求的提高&#xff0c;传统基于VB的质谱仪系统已经无法满足当前的高精度和高效率需求。这些系统通常存在着功能不全和操作复杂的问题&#xff0c;影响了科研和生产的进度。为了解决这些问题&#xff0c;开发了一套基于LabVIEW开…

`PF_NETLINK` 是用于与内核通信的Socket族之一

PF_NETLINK 是用于与内核通信的Socket族之一。在Linux系统中&#xff0c;Netlink是一种用于内核与用户空间进程之间通信的机制&#xff0c;而PF_NETLINK Socket族则用于创建与Netlink通信相关的Socket。通过Netlink Socket&#xff0c;用户空间程序可以与内核进行双向通信&…

16. C++标准库

C标准库兼容C语言标准函数库&#xff0c;可以在C标准库中直接使用C语言标准函数库文件&#xff0c;同时C标准库增加了自己的源代码文件&#xff0c;新增文件使用C编写&#xff0c;多数代码放在std命名空间中&#xff0c;所以连接C标准库文件后还需要 using namespace std;。 【…

Python算法题集_搜索旋转排序数组

Python算法题集_搜索旋转排序数组 题33&#xff1a;搜索旋转排序数组1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【二分法区间判断】2) 改进版一【二分找分界标准二分法】3) 改进版二【递归实现二分法】 4. 最优算法5. 相关资源 本文为Pytho…

Qt使用Q_DECLARE_INTERFACE Q_INTERFACES宏实现接口类使用qobject_cast进行类型转换

在写抽象类或者接口的时候&#xff0c;肯定是不能继承QObject的 但是又想使用qobject_cast进行类型转换&#xff0c;使用以下办法就能实现 #ifndef FACTORYINTERFACE_H__ #define FACTORYINTERFACE_H__ #include <QObject> class FactoryInterface{ public:FactoryInterf…

【C++进阶】C++多态概念详解

C多态概念详解 一&#xff0c;多态概念二&#xff0c;多态的定义2.1 多态构成的条件2.2 什么是虚函数2.3 虚函数的重写2.3.1 虚函数重写的特例2.3.2 override和final 2.4 重载和重写&#xff08;覆盖&#xff09;和重定义&#xff08;隐藏&#xff09;的区别 三&#xff0c;抽象…

salesforce Multi-Line Layout中公式字段不能显示吗

在Salesforce的多行布局中&#xff0c;公式字段是可以显示的。但是&#xff0c;有一些限制和注意事项&#xff1a; 默认情况下&#xff0c;公式字段可能不会显示&#xff1a; 公式字段在多行布局中默认是不包含的。您可能需要手动编辑多行布局&#xff0c;将公式字段添加到布局…

QGIS 开发之旅一《二次开发环境搭建》

1、 安装QT 下载QT Index of /new_archive/qt 我选择的版本是 Qt5.14.2 2、安装VS2017 Downloads & Keys - Visual Studio Subscriptions。下载后选择windows通用平台开发和C 开发就可以了。 3、安装插件QT vs tools 搜索 qt vs tools&#xff0c;选择第一个安装 …

3642. 最大公约数和最小公倍数 考研上机真题

输入两个正整数 m和 n&#xff0c;求其最大公约数和最小公倍数。 输入格式 一行&#xff0c;两个整数 m和 n。 输出格式 一行&#xff0c;输出两个数的最大公约数和最小公倍数。 数据范围 1≤n,m≤10000 输入样例&#xff1a; 5 7输出样例&#xff1a; 1 35 #include…

框架和函数库的区别

框架和函数库在软件开发中各自扮演着重要的角色&#xff0c;但它们之间存在一些关键的区别。 首先&#xff0c;从目的上来看&#xff0c;框架旨在提供一个完整的解决方案和开发规范&#xff0c;使开发者能够高效地构建应用程序。它实现了大部分功能&#xff0c;并定义了开发人员…

【工具篇】Unity翻书效果插件Book-Page Curl Pro教程

目录 一.切换目标页 二.自动翻书到目标页 三.动态添加书页 四.按钮控制翻页

Python合并两张图片 | 先叠透明度再合并 (附Demo)

目录 前言正文 前言 用在深度学习可增加噪音&#xff0c;增加数据集等 推荐阅读&#xff1a;Pytorch 图像增强 实现翻转裁剪色调等 附代码&#xff08;全&#xff09; 正文 使用Pillow库来处理图像&#xff08;以下两张图来自网络&#xff09; 图一&#xff1a; 图二&…

​FastIce-Tech 企业官网开源模版:专为中小企业设计的轻量级网址

标题&#xff1a;FastIce-Tech 企业官网开源模版&#xff1a;专为中小企业设计的轻量级网址 中小企业在建立企业官网时常常面临着时间、资源和技术的限制。为了解决这些问题&#xff0c;FastIce-Tech 企业官网开源模版应运而生。它是一个基于 Vue.js、ElementUI 和 Vue-Router …

(一)运行起自己的chatGPT

一、运行步骤 前面所有步骤可以参见https://datawhaler.feishu.cn/docx/BwjzdQPJRonFh8xeiSOcRUI3n8b 二、注意 需要注意的是&#xff1a; 部署起来后&#xff0c;必须使用域名访问才能进入。用ip地址端口访问不成功 三、运行效果 gradio需要额外配置一个外部端口&#x…

springboot+nacos使用

依赖 nacos服务发现和注册的依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency><dependency><groupId>com.alibaba.cloud</g…

亿发解析:互联网浪潮席卷,新零售崛起成为未来十年无可忽视之势

随着人们消费能力和水平的提高&#xff0c;消费者对产品质量的关注已不再仅限于产品本身&#xff0c;而更加强调产品质量与消费服务体验的双重重要性。随着互联网、移动支付、快递物流等技术的发展&#xff0c;这些技术催生了零售领域的新模式、新经济和新业态&#xff0c;为新…

区块链web3智能合约Solidity学习资源整理

简单说明&#xff1a; Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C&#xff0c;Python 和 Javascript 语言的影响&#xff0c;设计的目的是能在以太坊虚拟机&#xff08;EVM&#xff09;上运行。 Solidity中文官方文档&#xff1a; ht…

代码随想录算法训练营第52天|300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组

300.最长递增子序列 这道题还挺简单的&#xff0c;咱们设置dp[i]表示到第i个数字时的递增子序列的最长的值&#xff0c;那么dp[i]就要遍历从0到i-1的数&#xff0c;也就是看看当前这个数字是否比前面的数字大&#xff0c;如果大的话就看看现在的子序列长度是否会长于前面那个数…

机试:最大子序列的和

问题描述: 算法思想: 若第(i-1)个序列的小于0,则第i个序列的最大值为nums[i]; 若第(i-1)个序列的小于0,则第i个序列的最大值为max(i-1) nums[i]; 如果max(i-1)>0,max(i)max(i-1)Nums(i) 如果max(i-1)<0,max(i)Nums(i)代码示例: #include <bits/stdc.h> //该算法…