SpringBoot框架日志详解

程序浅谈 后端 2024-10-15

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-loggingLog4j 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外部配置文件依然可以很好的支持日志控制和管理。

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

日志框架默认的日志文件名
Logbacklogback-spring.xml,logback-spring.groovy,logback.xml,logback.groovy
Log4jlog4j-spring.properties,log4j-spring.xml,log4j.properties,log4j.xml
Log4j2log4j2-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

Apipost 私有化火热进行中

评论