SpringBoot框架日志详解

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文详细介绍了日志系统的重要性及其在不同环境下的配置方法。日志用于记录系统运行时的问题,确保服务的可靠性。文章解释了各种日志级别(如 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


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6天前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
17 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
1月前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
1月前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
1天前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
17 3
|
2天前
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
17 3
|
2天前
|
Java Maven Spring
SpringBoot日志整合
SpringBoot日志整合
9 2
|
3天前
|
人工智能 缓存 Java
深入解析Spring AI框架:在Java应用中实现智能化交互的关键
【10月更文挑战第12天】Spring AI 是 Spring 框架家族的新成员,旨在满足 Java 应用程序对人工智能集成的需求。它支持自然语言处理、图像识别等多种 AI 技术,并提供与云服务(如 OpenAI、Azure Cognitive Services)及本地模型的无缝集成。通过简单的配置和编码,开发者可轻松实现 AI 功能,同时应对模型切换、数据安全及性能优化等挑战。
|
7天前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
15 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
22天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
904 9
|
20天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍