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日志并进行多维度分析。
目录
打赏
0
0
0
0
171
分享
相关文章
Spring框架初识
Spring 是一个分层的轻量级开源框架,核心功能包括控制反转(IOC)和面向切面编程(AOP)。主要模块有核心容器、Spring 上下文、AOP、DAO、ORM、Web 模块和 MVC 框架。它通过 IOC 将配置与代码分离,简化开发;AOP 提供了声明性事务管理等增强功能。
87 21
Spring框架初识
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
11 1
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
24 5
|
4月前
|
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
190 0
Spring AI Alibaba 应用框架挑战赛圆满落幕,恭喜获奖选手
第二届开放原子大赛 Spring AI Alibaba 应用框架挑战赛决赛于 2 月 23 日在北京圆满落幕。
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
18 0
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
12 0
|
2天前
|
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——slf4j 介绍
在软件开发中,`System.out.println()`常被用于打印信息,但大量使用会增加资源消耗。实际项目推荐使用slf4j结合logback输出日志,效率更高。Slf4j(Simple Logging Facade for Java)是一个日志门面,允许开发者通过统一方式记录日志,无需关心具体日志系统。它支持灵活切换日志实现(如log4j或logback),且具备简洁占位符和日志级别判断等优势。阿里巴巴《Java开发手册》强制要求使用slf4j,以保证日志处理方式的统一性和维护性。使用时只需通过`LoggerFactory`创建日志实例即可。
11 0
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
148 29

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等