重学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开…

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…

【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;抽象…

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;选择第一个安装 …

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;为新…

机试:最大子序列的和

问题描述: 算法思想: 若第(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> //该算法…

第五十六回 徐宁教使钩镰枪 宋江大破连环马-飞桨图像分类套件PaddleClas初探

宋江等人学会了钩镰枪&#xff0c;大胜呼延灼。呼延灼损失了很多人马&#xff0c;不敢回京&#xff0c;一个人去青州找慕容知府。一天在路上住店&#xff0c;马被桃花山的人偷走了&#xff0c;于是到了青州&#xff0c;带领官兵去打莲花山。 莲花山的周通打不过呼延灼&#xf…

Promise其实也不难

难点图解&#xff1a;then&#xff08;&#xff09;方法 ES6学习网站&#xff1a;ES6 入门教程 解决&#xff1a;回调地狱&#xff08;回调函数中嵌套回调&#xff09; 两个特点&#xff1a; &#xff08;1&#xff09;对象的状态不受外界影响。Promise对象代表一个异步操作&…

AvP:水平基因转移HGT检测

帮其他人做的一个尝试&#xff0c;本身不太了解这一块&#xff0c;要是做错了请多多包涵 Home GDKO/AvP Wiki GitHub 安装AvP 数据库准备 git clone https://github.com/GDKO/AvP.git conda create --name avp conda activate avp conda install -y -c bioconda mafft bl…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PluginComponent)

提供外部应用组件嵌入式显示功能&#xff0c;即外部应用提供的UI可在本应用内显示。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。本组件为系统接口。 子组件 无 接口 PluginComponent(value:…

strstr函数及其模拟实现

模拟实现的代码&#xff1a; char* my_strstr(char* p1, char* p2) {char* startp1;//记录被查找字符串的首地址char* begin p2;//记录要查找字符串的首地址while (1){while (*p1 ! *p2)//首元素不相同&#xff0c;p1向后移动一位{p1;}start p1;//找到了首元素相同的地址&am…

​如何防止网络攻击?

应对不同类型网络攻击的最佳途径是“知己”、“知彼”&#xff0c;在了解它们的工作原理、能够识别其手段、方法及意图的前提下&#xff0c;找出针对性的应对文案。今天&#xff0c;就为大家总结以下防止不同类型网络攻击的有效方法&#xff0c;希望无论是对个人、还是企业和组…

在文件夹下快速创建vue项目搭建vue框架详细步骤

一、首先在你的电脑目录下新建一个文件夹 进入该文件夹并打开控制台&#xff08;输入cmd指令&#xff09; 进入控制台后输入 vue create springboot_vue (自己指定名称) 如果出现这类报错如&#xff1a;npm install 的报错npm ERR! network request to http://registry.cnp…

python读取大型csv文件,降低内存占用,提高程序处理速度

文章目录 简介读取前多少行读取属性列逐块读取整个文件总结参考资料 简介 遇到大型的csv文件时&#xff0c;pandas会把该文件全部加载进内存&#xff0c;从而导致程序运行速度变慢。 本文提供了批量读取csv文件、读取属性列的方法&#xff0c;减轻内存占用情况。 import pand…