深入理解 SpringBoot 日志框架:从入门到高级应用——(七)SpringBoot日志配置

news2024/12/26 0:03:24

SpringBoot 官方文档:https://docs.spring.io/spring-boot/docs/2.7.12/reference/htmlsingle

SpringBoot 底层依赖

Spring Boot 对所有内部日志记录使用 Commons Logging,但使底层日志实现保持为打开状态。 为 Java Util Logging、Log4J2 和 Logback 提供了默认配置。默认情况下,Logback、 Java Util Logging、Commons Logging、Log4J 或 SLF4J 都能正常工作。而 Spring Boot 中使用了 SLF4J + Logback 作为默认的日志框架,因此我们不需要更改日志记录依赖项,Spring 引导默认值就可以正常工作。SpringBoot 底层日志依赖关系如图所示:

image-20230611223321331

spring-boot-starter 依赖下有 spring-boot-starter-logging 日志依赖,后续的 logback-corelogback-core 依赖即使用 Logback 记录日志,而 jul-to-slf4jlog4j-to-slf4j 即将 JULLog4j 日志框架转为 Slf4j 日志框架,即所谓的桥接器。

日志组

我们也可以将相关的日志记录器组合在一起,以便可以同时配置它们。例如,可能经常更改所有与 Tomcat 相关的记录器的日志记录级别,我们可以在 YAML 配置文件中将与 Tomcat 相关的包添加成一个组,之后再对组设置日志输出的级别:

logging:
  group:
    # 自定义组名,设置当前组中所包含的包
    tomcat: org.apache.catalina,org.apache.coyote,org.apache.tomcat

SpringBoot 包括以下预定义的日志记录组:

NameLoggers
weborg.springframework.core.codec
org.springframework.http
org.springframework.web
org.springframework.boot.actuate.endpoint.web
org.springframework.boot.web.servlet.ServletContextInitializerBeans
org.springframework.core.codec
org.springframework.http
org.springframework.web
org.springframework.boot.actuate.endpoint.web
org.springframework.boot.web.servlet.ServletContextInitializerBeans
sqlorg.springframework.jdbc.core
org.hibernate.SQL
org.jooq.tools.LoggerListener
org.springframework.jdbc.core
org.jooq.tools.LoggerListener

日志级别

在SpringBoot 中,日志的级别默认分为7个级别:TRACE(跟踪)、DEBUG(调试)、 INFO(信息)、WARN(警告)、ERROR(错误)、FATAL(致命)、OFF(关闭)。

我们可以根据需要设置不同的日志级别,在 SpringBoot 的 YAML 配置文件中对所有的日志框架输出的日志级别进行设置。我们可以对全局或者指定分组以及指定包分别设置日志的输出级别:

logging:
  level:
    # 设置root根节点级别,即整体应用日志级别,输出 WARN 级别及以上的日志信息
    root: warn
    # 为对应组设置日志级别,输出 TRACE 级别及以上的日志信息
    tomcat: trace
    # 为对包设置日志级别,输出 DEBUG 级别及以上的日志信息
    com.example.logging: debug

日志格式

在配置文件中设置日志的输出格式:

# 设置日志输出格式
logging:
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{36}] - %msg%n"

SpringBoot 的默认日志输出格式如下:

image-20230612003611166

输出格式如下:

输出项描述
Date and Time日期和时间:毫秒级精度,易于排序
Log Level日志级别:ERROR WARN INFO DEBUG TRACE
Process ID进程 Id
---用于区分实际日志消息开头的分隔符
Thread name线程名,括在方括号中(对于控制台输出,可能会被截断)
Logger name记录器名称:通常是源类名称(通常缩写)
message日志消息

常用占位符如下:

占位符描述
%d表示输出到毫秒的时间,例如%d{yyyy-MM-dd HH:mm:ss.SSS}
%-5level输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%n输出换行符
%thread输出日志的线程名称,例如:main
%logger输出日志记录器名称,例如:com.example.MyClass
%msg输出日志的消息内容
%X输出 MDC(Mapped Diagnostic Context)中的键值对,例如:%X{user}
%class输出日志的类名,例如:com.example.MyClass
%method输出日志的方法名,例如:doSomething
%file输出日志的文件名,例如:MyClass.java
%line例如:10
%color()颜色:%black、%shired、%green、%yellow、%blue、%magenta、%cyan、%white、%gray、%boldRed、%boldGreen、%boldYellow、%boldBlue、%boldMagenta、%boldCyan、%boldWhite、%highlight

以上是一些常用的占位符,可以根据需要自行组合使用。

Spring Boot使用Logback作为默认的日志框架,可以通过在application.properties或application.yml文件中设置日志级别和日志输出格式。

以下是application.yml中常用的日志配置选项:

# 设置日志输出文件的路径和名称
logging:
  file:
    name: myapp.log
    path: /var/log/myapp/

以上示例中,logging.level 设置日志级别,logging.pattern设置日志输出格式,logging.file.name和logging.file.path设置日志输出文件的路径和名称。需要注意的是,如果同时设置了logging.file和logging.path选项,则logging.file选项将覆盖logging.path选项。

文件输出

SpringBoot 默认会将日志输出到控制台,并不会写入日志文件。 如果我们需要将日志写入日志文件,则需要在 application.yml 中进行相关配置:

# 设置日志输出文件的路径和名称
logging:
  file:
    name: myapp.log
    path: /var/log/myapp/
logging.file.namelogging.file.path样例描述
(无)(无)仅控制台日志记录。
特定文件(无)my.log写入指定的日志文件。 名称可以是确切的位置,也可以是相对于当前目录的位置。
(无)特定目录/var/log写入指定的目录。 名称可以是确切的位置,也可以是相对于当前目录的位置。spring.log

Tip

logging.file.name 和 logging.file.path 设置日志输出文件的路径和名称。需要注意的是,如果同时设置了logging.file 和 logging.path 选项,则 logging.file 选项将覆盖 logging.path 选项。

自定义日志配置

在 SpringBoot 中,我们除了使用默认的配置外,还可以通过在 src/main/resources 目录下添加自定义日志配置文件来自定义日志输出的格式、级别、以及日志文件的位置等信息。

方式1:限定文件名

通过 SpringBoot 指定限定名的方式:项目启动时会自动进行加载:

日志框架配置文件名
Logbacklogback-spring.xmllogback.xml
Log4j2log4j2-spring.xmllog4j2.xml
Log4jlog4j.properties
JDK (Java Util Logging)logging.properties

使用该方式,Spring 官方推荐建议您我们使用 *-spring.xml 的限定名,这样可以交由 SpringBoot 控制日志,我们也可以对其中的配置进行更加细化的设置:

<springProfile name="dev">
    <!-- 配置项在 spring.profiles.active=dev 的环境下启动 -->
</springProfile>
<springProfile name="!dev">
    <!-- 配置项在 spring.profiles.active!=dev 的环境下启动 -->
</springProfile>

方式2:自定义文件名

以下是自定义日志文件名的步骤:

  1. 在 src/main/resources 目录下创建一个名为 logback-dev.xml 的文件,这个文件名称可以自定义。
  2. 在配置文件中指定日志配置文件:
logging.config=classpath:logging-config.xml

日志框架切换

Logback To Log4j

原理图如右图:

image-20230612162730184

方式1

我们需要将对应 logback 框架的依赖进行移除,添加 slf4j-log4j12 的适配器即可。

image-20230612213316254

  1. 移除日志框架 logback 的依赖:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    
  2. 引入适配器 slf4j-log4j12log4j 的依赖

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </dependency>
    

方式2

  1. 移除 spring-boot-starter-logging 依赖:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    
  2. 添加 spring-boot-starter-log4j 依赖:

    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-log4j</artifactId>
      <version>1.3.8.RELEASE</version>
    </dependency>
    

添加 log4j.properties 配置文件

log4j 不提供默认配置,因为输出到控制台或者文件系统在某些环境中可能是被禁止的。所以需要在 resources 目录下手动添加配置文件,配置文件名为 log4j.properties

Logback To Log4j2

同理,我们需要排除原有的依赖,替换新的依赖即可:

  1. 移除依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    
  2. 添加依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    
  3. 需要异步

    <!--开启异步时需要导入依赖-->
    <dependency>
      <groupId>com.lmax</groupId>
      <artifactId>disruptor</artifactId>
      <version>3.4.2</version>
    </dependency>
    

添加配置文件

有关部分请查看文章:深入理解 SpringBoot 日志框架:从入门到高级应用——(五)Log4j2配置文件详解

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

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

相关文章

【计算机网络自顶向下】如何学好计网-第一章概论

相关术语 URI&#xff1a;Uniform Resource Identifier 统一资源标识符&#xff0c;指的是一个资源 URL&#xff1a;Uniform Resource Location 统一资源定位符&#xff0c;URI的子集&#xff0c;用地址定为的方式指定一个资源 URN&#xff1a;Uniform Resource Name 统一资…

DBeaver连接SQLite数据库

一、前言 SQLite小巧轻便的开源免费关系型数据库&#xff0c;适合嵌入单机应用随身携带。桌面版推荐使用DBeaver。 官网&#xff1a;SQLite Download Page github&#xff1a;GitHub - sqlite/sqlite: Official Git mirror of the SQLite source tree 类似的开源免费且小巧…

vue+elementui实现app布局小米商城,样式美观大方

目录 一、效果图 1.首页效果图 2.分类 3.购物车 4.我的 5.登录注册 6.商品详情 7.搜索 二、项目实现 1.项目结构、设计说明 2.路由配置实现 3.首页实现源码 4.登录注册实现&#xff0c;模拟登录注册流程&#xff0c;用户数据存储到本地浏览器缓存 三、总结 一、效果…

『2023北京智源大会』开幕式以及基础模型前沿技术论坛

『2023北京智源大会』开幕式以及基础模型前沿技术论坛 文章目录 一. 黄铁军丨智源研究院院长1. 大语言模型2. 大语言模型评测体系FlagEval3. 大语言模型生态(软硬件)4. 三大路线通向 AGI(另外2条路径) 二. Towards Machines that can Learn, Reason, and Plan(杨立昆丨图灵奖得…

UE4/5样条线学习(四):样条线的创建和自然摆动

这一次我们创建一个actor蓝图&#xff0c;不过我们这次并不需要在一开始就创建样条线组件&#xff0c;而是在游戏中根据两个点去创建样条线&#xff0c;然后用时间轴根据样条线带动物品旋转位移。 制作&#xff1a; 组件部分&#xff1a; 第一步&#xff0c;创建一个actor蓝图…

CSDN铁粉增长秘籍

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

【Jmeter】在进行综合场景压测时,由于不同的请求,要求所占比例不同,那如何实现呢?

在进行综合场景压测时&#xff0c;由于不同的请求&#xff0c;要求所占比例不同&#xff0c;那如何实现呢&#xff1f; 有人说将这些请求分别放到单独的线程组下&#xff0c;然后将线程组的线程数按照比例进行配置&#xff0c;这种方法不是很好&#xff0c;想想&#xff0c;不…

【计算机网络自顶向下】如何学好计网-第二章应用层

第二章 应用层 应用层协议原理 网络应用程序体系结构 客户机/服务器体系结构&#xff1a;至少有一个服务器&#xff0c;一个客户机&#xff0c;其中服务器总是打开的&#xff0c;具有固定的众所周知的IP地址&#xff0c;主机群集常被用于创建强大的虚拟服务器&#xff0c;而客…

OpenCV 笔记_1

笔记_1 文章目录 笔记_1Mat类数据类型读取Mat类支持的运算图像读取&#xff0c;显示&#xff0c;保存imread 图像读取namedWindow 创建要显示的窗口imshow 窗口显示imwrite 图像保存 视频加载与摄像头的使用VideoCapture 加载视频或摄像头get 获取属性VideoWriter 保存视频 图像…

vue 生命周期

人的-生命周期 一组件从 创建 到 销毁 的整个过程就是生命周期 Vue_生命周期 1. 钩子函数 Vue 框架内置函数&#xff0c;随着组件的生命周期阶段&#xff0c;自动执行 作用: 特定的时间点&#xff0c;执行特定的操作 场景: 组件创建完毕后&#xff0c;可以在created 生命周期…

实际项目中使用gorm-gen来生成实体类

一、为什么要使用gorm-gen来生成实体类和查询 1、根据gorm官网地址&#xff0c;正常的写法是先写数据模型,然后由数据模型自动同步生成到数据库中,但是这样的工作量会比较大,对于写后端的人来说都熟悉sql语句,正常来说都是先自己手动创建表,利用工具将表字段同步到项目实体类中…

java商业销售分析系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 商业销售分析系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

电脑重装系统后需要更新哪些驱动

在电脑重装系统后&#xff0c;由于系统的重置&#xff0c;您需要重新安装和更新一些关键的驱动程序&#xff0c;以确保硬件设备正常工作和性能最佳化。以下是在电脑重装系统后需要更新的一些常见驱动程序。 工具/原料&#xff1a; 系统版本&#xff1a;win10系统 品牌型号&…

TOGAF10®标准中文版-(介绍和核心概念)摘要

第1章&#xff1a;简介 TOGAF标准是企业架构的框架。任何希望开发企业架构以在该组织内使用的组织都可以免费使用它&#xff08;见第1.3.1节&#xff09;。 TOGAF标准由The Open Group成员在架构论坛内开发和维护&#xff08;请参阅www.opengroup.org/Architecture&#xff0…

java8 (jdk 1.8) 新特性——Lambda 以及函数式接口

1. 什么是lambda? 目前已知的是&#xff0c;有个箭头 -> 说一大段官方话&#xff0c;也没有任何意义 我们直接看代码&#xff1a; 之前我们创建线程是这样的 Runnable runnable new Runnable() {Overridepublic void run() {System.out.println("run。。。。。。…

阿里云服务器的网络性能如何?有多快?是否适合高流量应用?

阿里云服务器的网络性能如何&#xff1f;有多快&#xff1f;是否适合高流量应用&#xff1f;   [本文由阿里云代理商[聚搜云www.4526.cn]撰写]    阿里云服务器网络性能简介   阿里云服务器&#xff08;ECS&#xff09;在网络性能方面表现卓越&#xff0c;可满足用户对高…

通过环路分析仪得到系统的闭环传递函数方法(Matlab System Identification)

目录 前言 环路分析仪数据整理 Matlab导入环路分析仪的数据 System Identification使用 闭环传递函数导出 总结 前言 之前开发的时候通过Matlab的环路设计工具实现了控制系统的补偿器参数整定&#xff0c;然后在系统硬件上面进行了验证&#xff0c;设计带宽和环路分析仪的…

基于Java实验中心管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

排序算法:插入排序(直接插入排序、希尔排序)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

CQ 社区版 v2.1.0 发布 | 新增数据发布变更、内置脱敏规则等功能

Hello&#xff0c;社区的小伙伴们&#xff0c;又到了每月版本发布时间。&#x1f389;&#x1f389;&#x1f389; 本次社区版更新带来了新功能 「发布变更」&#xff0c;以及内置脱敏规则、授权粒度细化、连接池管理、变更链接密钥等&#xff0c;信息量不少&#xff0c;一起来…