SpringBoot框架日志详解

简介: 本文详细介绍了日志系统的重要性及其在不同环境下的配置方法。日志用于记录系统运行时的问题,确保服务的可靠性。文章解释了各种日志级别(如 info、warn、error 等)的作用,并介绍了常用的日志框架如 SLF4J 和 Logback。此外,还说明了如何在 SpringBoot 中配置日志输出路径及日志级别,包括控制台输出与文件输出的具体设置方法。通过这些配置,开发者能够更好地管理和调试应用程序。

日志的作用

在本地调试的时候,我们可以通过断点等方式进行调试、但是当系统在测试环境或者被部署到生产环境 中,我们无法通过断点进行调试。而且很多时候我们都是等问题发生之后才能获知问题的出现。这个时候 我们需要一个可靠的方式记录问题发生的情况。日志系统虽然不能实现什么业务、也无法提高系统的性 能。但是日志是保证服务可靠的重要功能。

日志级别

日志级别 描述 输出内容的日志级别
all 最低等级的,用于打开所有日志记录。 all,trace,debug,info,warn,error,fatal,off
trace 这是一个很低的日志级别,一般使用不到。 trace,debug,info,warn,error,fatal,off
debug 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。 debug,info,warn,error,fatal,off
info 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的无用日志日志,导致系统在出现问题时,大多浪费时间在无用的日志上,而且还占用空间。 info,warn,error,fatal,off
warn 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。 warn,error,fatal,off
error 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。 error,fatal,off
fatal 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。 fatal,off
off 最高等级的,用于关闭所有日志记录。 off(也就是不输出任何日志信息)

注:error、warn、info、debug日志级别较为常用。

日志框架

市场上存在非常多的日志框架,分为日志门面(日志的抽象层)和日志实现。 可以这样理解:日志门面相当于是接口,日志实现相当于是接口的实现类。

日志门面 日志实现
JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging Log4j JUL(java.util.logging) Log4j2 Logback

注:使用日志框架需要选择一个日志门面(抽象层)、一个日志实现,搭配使用。

  • 默认情况下,SpringBoot使用了slf4j+logback这样的日志门面和日志实现的组合,所以我们这边不对日志框架进行修改,直接在原有的日志基础上进行配置。
  • 我们在引入spring-boot-starter-web依赖时,已经包含了 spring-boot-starter-logging这个日志依赖。所以我们无需在引入spring-boot-starter-logging依赖

日志相关配置

文件输出

默认情况下,Spring Boot将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在application.properties中设置logging.file或logging.path属性。

属性设置 解释
logging.file 设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log 如果只配置 logging.file,会在项目的当前路径下生成一个 xxx.log 日志文件。
logging.path 设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log如果只配置 logging.path,在 /var/log文件夹生成一个日志文件为 spring.log

注:二者不能同时使用,如若同时使用,则只有logging.file生效

级别控制

所有支持的日志记录系统都可以在Spring环境中设置记录级别(例如在application.properties中) 格式为:’logging.level.* = LEVEL’

解释:

  • logging.level:日志级别控制前缀,*为包名或Logger名
  • LEVEL:选项TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF

举例:logging.level.com.dudu=DEBUGcom.dudu包下所有class以DEBUG级别输出

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载。

自定义日志配置

由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

日志框架 默认的日志文件名
Logback logback-spring.xml,logback-spring.groovy,logback.xml,logback.groovy
Log4j log4j-spring.properties,log4j-spring.xml,log4j.properties,log4j.xml
Log4j2 log4j2-spring.xml,log4j2.xml
JDK (Java Util Logging) logging.properties

如果你即想完全掌控日志配置,但又不想用logback-spring.xml作为Logback配置的名字,可以在application.properties配置文件里面通过logging.config属性指定自定义的名字:

arduino

代码解读

复制代码

logging.config=classpath:logging-config.xml

注:我们要把日志配置文件(logback-spring.xml)放在src/main/resources下面即可

配置文件:(参考)

xml

代码解读

复制代码

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds">
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->

<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="C:/workplace/guli_parent/logs" />

<!-- 彩色日志 -->
<!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 -->
<!-- magenta:洋红 -->
<!-- boldMagenta:粗红-->
<!-- cyan:青色 -->
<!-- white:白色 -->
<!-- magenta:洋红 -->
<property name="CONSOLE_LOG_PATTERN"
         value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>


<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
   <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
   <!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 -->
   <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
       <level>info</level>
   </filter>
   <encoder>
       <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
       <!-- 设置字符集 -->
       <charset>UTF-8</charset>
   </encoder>
</appender>


<!--输出到文件-->

<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <!-- 正在记录的日志文件的路径及文件名 -->
   <file>${log.path}/log_info.log</file>
   <!--日志文件输出格式-->
   <encoder>
       <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
       <charset>UTF-8</charset>
   </encoder>
   <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
       <!-- 每天日志归档路径以及格式 -->
       <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
       <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
           <maxFileSize>100MB</maxFileSize>
       </timeBasedFileNamingAndTriggeringPolicy>
       <!--日志文件保留天数-->
       <maxHistory>15</maxHistory>
   </rollingPolicy>
   <!-- 此日志文件只记录info级别的 -->
   <filter class="ch.qos.logback.classic.filter.LevelFilter">
       <level>INFO</level>
       <onMatch>ACCEPT</onMatch>
       <onMismatch>DENY</onMismatch>
   </filter>
</appender>

<!-- 时间滚动输出 level为 WARN 日志 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <!-- 正在记录的日志文件的路径及文件名 -->
   <file>${log.path}/log_warn.log</file>
   <!--日志文件输出格式-->
   <encoder>
       <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
       <charset>UTF-8</charset> <!-- 此处设置字符集 -->
   </encoder>
   <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
       <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
       <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
           <maxFileSize>100MB</maxFileSize>
       </timeBasedFileNamingAndTriggeringPolicy>
       <!--日志文件保留天数-->
       <maxHistory>15</maxHistory>
   </rollingPolicy>
   <!-- 此日志文件只记录warn级别的 -->
   <filter class="ch.qos.logback.classic.filter.LevelFilter">
       <level>warn</level>
       <onMatch>ACCEPT</onMatch>
       <onMismatch>DENY</onMismatch>
   </filter>
</appender>


<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <!-- 正在记录的日志文件的路径及文件名 -->
   <file>${log.path}/log_error.log</file>
   <!--日志文件输出格式-->
   <encoder>
       <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
       <charset>UTF-8</charset> <!-- 此处设置字符集 -->
   </encoder>
   <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
       <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
       <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
           <maxFileSize>100MB</maxFileSize>
       </timeBasedFileNamingAndTriggeringPolicy>
       <!--日志文件保留天数-->
       <maxHistory>15</maxHistory>
   </rollingPolicy>
   <!-- 此日志文件只记录ERROR级别的 -->
   <filter class="ch.qos.logback.classic.filter.LevelFilter">
       <level>ERROR</level>
       <onMatch>ACCEPT</onMatch>
       <onMismatch>DENY</onMismatch>
   </filter>
</appender>

<!--
   <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
   <logger>仅有一个name属性,
   一个可选的level和一个可选的addtivity属性。
   name:用来指定受此logger约束的某一个包或者具体的某一个类。
   level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
         如果未设置此属性,那么当前logger将会继承上级的级别。
-->
<!--
   使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
   第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
   第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别:
-->
<!--开发环境:打印控制台-->
<springProfile name="dev">
   <!--可以输出项目中的debug日志,包括mybatis的sql日志-->
   <logger name="com.chen" level="INFO" />

   <!--
       root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
       level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG
       可以包含零个或多个appender元素。
   -->
   <root level="INFO">
       <appender-ref ref="CONSOLE" />
       <appender-ref ref="INFO_FILE" />
       <appender-ref ref="WARN_FILE" />
       <appender-ref ref="ERROR_FILE" />
   </root>
</springProfile>


<!--生产环境:输出到文件-->
<springProfile name="pro">

   <root level="INFO">
       <appender-ref ref="CONSOLE" />
       <appender-ref ref="DEBUG_FILE" />
       <appender-ref ref="INFO_FILE" />
       <appender-ref ref="ERROR_FILE" />
       <appender-ref ref="WARN_FILE" />
   </root>
</springProfile>

</configuration>

注意点:

  • 上面的日志配置文件使用了Grep Console插件,所以我们要提前安装这彩色日志插件。
  • 修改 的value属性,也就是修改日志文件保存的位置。
  • 修改的name属性,(输出在该包下的日志信息)。
  • 使用mybatis的时候,sql语句是debug日志级别下才会打印,所以我们要将mapper(dao)包的日志级别修改为debug。

后记

本文主要讲述了SpringBoot框架日志部分的原理和配置,希望能够对大家有所启发。

转载来源:https://juejin.cn/post/7398461918906302474


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
3月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
319 2
|
2月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
4月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
5月前
|
Java Spring
聊聊你对SpringBoot框架的理解 ?
SpringBoot是Spring家族中流行的子项目,旨在简化Spring框架开发的繁琐配置。它主要提供三大功能:starter起步依赖简化依赖管理,自动配置根据条件创建Bean,以及内嵌Web服务器支持Jar包运行,极大提升了开发效率。
188 0
|
2月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
157 8
|
3月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
664 5
|
3月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
476 1
|
5月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
673 1
|
5月前
|
机器学习/深度学习 XML Java
【spring boot logback】日志logback格式解析
在 Spring Boot 中,Logback 是默认的日志框架,它支持灵活的日志格式配置。通过配置 logback.xml 文件,可以定义日志的输出格式、日志级别、日志文件路径等。
1019 5
|
4月前
|
Cloud Native Java API
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
967 0

热门文章

最新文章