SpringBoot集成slf4j日志和logback.xml配置详解
一、Slf4j概述
slf4j,即(Simple Logging Facade for Java,简单门面日志)。它是对所有日志框架制定的一种
规范、标准、接口
,并不是一个框架的具体的实现,它只服务于各种各样的日志系统。
slf4j提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。
比如,一个项目中用到了logback,引入的类库则是使用log4j的,那么是不是要去维护两套日志框架,但是如果类库是使用SLF4J,开发的时候能够继续使用当前的日志框架,因为slf4j能够选择使用哪个实现框架,而不用维护另一套日志框架。
另一个特性是,SLFJ4J在日志打印的时候,使用的占位符的特性。在运行时候,占位符会被某个实际的字符串替换,从而节省新建的String对象,并且能够减少字符串的次数。
二、使用Slf4j打印日志
packagecom.zhou.test;importlombok.extern.slf4j.Slf4j;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;/**
* 日志测试类
*/@Slf4jpublicclassLogTest{privatestaticfinalLogger logger =LoggerFactory.getLogger(LogTest.class);publicstaticvoidlogTestOut(){for(int i =0; i <10000; i++){
logger.info("org.slf4j.Logger输出");
log.info("lombok.extern.slf4j.Slf4j包下日志输出");}}publicstaticvoidmain(String[] args)throwsInterruptedException{while(true){logTestOut();Thread.sleep(5*1000);}}}
日志输出结果
2023-05-26 10:53:37.072 [main] INFO com.zhou.test.LogTest - org.slf4j.Logger输出
2023-05-26 10:53:37.074 [main] INFO com.zhou.test.LogTest - lombok.extern.slf4j.Slf4j包下日志输出
1.代码方式使用Slf4j
SpringBoot框架内部已经集成slf4j,因此并不需要引入其他依赖,使用时需要在类中使用LoggerFactory.getLogger(类名.class)可以获取到logger对象
privatestaticfinalLogger logger =LoggerFactory.getLogger(LogTest.class);
2.lombok使用注解引入@Slf4j
使用lombok只需要引入依赖后在类上加@Slf4j注解即可直接使用
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
三、项目如何配置logback.xml
1. applicaiton.yml配置
本测试项目的applicaiton.yml配置如下,指定了logback.xml的路径和指定目录下日志打印的级别
server:port:8083# 日志配置logging:config: classpath:logback.xml
level:com.zhou.test: info
org.springframework: warn
logging.config:指定项目启动的时,读取logback.xml日志配置文件
logging.level:配置指定包的路径下应用程序的日志记录和日志级别。
2. 日志级别及优先级
- **trace(跟踪)**:一般用来追踪详细的程序运行流,比如程序的运行过程中,运行到了哪一个方法,进入了哪一条分支。通过 trace程序的运行流程,可以判断程序是否按照期望的逻辑在运行
- **debug(调试 )**:这类日志往往用在判断是否有出现bug的场景,且往往记录了代码运行的详细信息,比如方法调用传入的参数信息
- **info(消息)**:用来记录程序运行的一些关键信息,它不像trace那样记录程序运行的整个流程,也不像debug那样为了解决问题而记录详细的信息。info记录的是整个系统的运行信息,比如系统运行到了哪一个阶段,到达了哪一个状态
- **warn(警告)**:用来记录一些警告信息。警告信息表示,程序进入了一个特殊的状态,在该状态下程序可以继续运行,但是不建议让程序进入该状态,因为该状态可能导致结果出现问题
- **error(错误)**:用来记录运行时的错误信息,表示程序运行过程中出现了需要被解决的问题,往往是一些异常。使用error日志的时候,一般会将详细的异常出现的原因记录
日志优先级从高到低依次为trace、debug、info、warn、error。相对而言,打印的日志会越来越少。
3. logback.xml日志配置文件
<?xml version="1.0" encoding="UTF-8"?><configurationdebug="true"><!-- 应用名称 --><propertyname="APP_NAME"value="log-test"/><!--定义日志文件的存储地址--><propertyname="LOG_HOME"value="/logs/${APP_NAME}"/><!-- 定义日志格式 --><propertyname="LOG_PATTERN"value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/><!-- 高亮日志格式 --><propertyname="HIGHLIGHT_PATTERN"value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/><!-- 控制台输出-高亮 --><appendername="CONSOLE-WITH-HIGHLIGHT"class="ch.qos.logback.core.ConsoleAppender"><encoderclass="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${HIGHLIGHT_PATTERN}</pattern></encoder></appender><!--文件输出的格式设置 --><appendername="FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false --><prudent>false</prudent><!-- 日志日常打印日志文件,生成日志示例:/logs/log-test/info.log --><file>${LOG_HOME}/info.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 压缩日志的路径和日志格式,示例:info-2023-05-26_21.log.zip,%d{yyyy-MM-dd}:表示文件名称包含日期,%i:表示当前是第几个压缩文件 --><fileNamePattern>${LOG_HOME}/info-%d{yyyy-MM-dd}_%i.log.zip</fileNamePattern><!-- 如果按天来回滚,则最大保存时间为7天,7天之前的都将被清理掉 --><maxHistory>7</maxHistory><!-- 日志总保存量为10GB,超过该日志总量的最早的日志压缩包会被清除 --><totalSizeCap>10GB</totalSizeCap><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!--文件达到 最大100MB时会被压缩和切割 --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!-- 文件输出的日志 的格式 --><encoderclass="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 日志输出级别 --><loggername="org.springframework"level="INFO"/><loggername="com.zhou.*"level="INFO"/><rootlevel="INFO"><appender-refref="CONSOLE-WITH-HIGHLIGHT"/><appender-refref="FILE"/></root></configuration>
4. logback.xml日志配置的实现效果
以下配置生成了日志文件info.log,如果超过了最大设置
<maxFileSize>100MB</maxFileSize>
,则日志文件会被压缩和切割。如果日志文件总大小超过了
<totalSizeCap>10GB</totalSizeCap>
,超过该日志总量的最早的日志压缩包会被清除
<!-- 日志日常打印日志文件,生成日志示例:/logs/log-test/info.log --><file>${LOG_HOME}/info.log</file>
四、logback.xml配置文件解析
1.定义日志文件的存储地址
<!-- 应用名称 --><propertyname="APP_NAME"value="log-test"/><!--定义日志文件的存储地址--><propertyname="LOG_HOME"value="/logs/${APP_NAME}"/>
namevalue作用APP_NAMElog-test定义当前项目的名称LOG_HOME/logs/${APP_NAME}定义日志的路径,${APP_NAME}:表示引用上面定义的项目名,最后生成路径为:/logs/log-test/…
2.定义日志格式
普通日志格式
<!-- 定义日志格式 --><propertyname="LOG_PATTERN"value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/>
name="LOG_PATTERN"
表示定义日志格式名称
参数含义%d表示日期(也可以使用"%date")%-5level表示级别从左显示5个字符宽度%thread表示线程名称%-30.30logger{30}表示如果logger的名称小于30,就“-”指定左对齐;如果其名称长于30字符,就从左边较远输出的字符截掉,保持logger的名字长度最终限制为30个字符%msg表示日志消息%n表示换行符
效果如下:
2023-05-26 15:19:28.337 [INFO ][main][om.zhou.test.LogTest] Info级别的日志输出
2023-05-26 15:19:28.339 [ERROR][main][om.zhou.test.LogTest] Error级别的日志输出
高亮日志格式
<!-- 高亮日志格式 --><propertyname="HIGHLIGHT_PATTERN"value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>
name="HIGHLIGHT_PATTERN"
表示定义日志格式名称
参数含义%yellow()%green(%highlight()颜色高亮%d表示日期(也可以使用"%date")%-5level表示级别从左显示5个字符宽度%thread表示线程名称%-30.30logger{30}表示如果logger的名称小于30,就“-”指定左对齐;如果其名称长于30字符,就从左边较远输出的字符截掉,保持logger的名字长度最终限制为30个字符%msg表示日志消息%n表示换行符
效果如下:
3. 定义控制台输出
<!-- 控制台输出-高亮 --><appendername="CONSOLE-WITH-HIGHLIGHT"class="ch.qos.logback.core.ConsoleAppender"><encoderclass="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${HIGHLIGHT_PATTERN}</pattern></encoder></appender>
标签含义appender负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名encoder对日志进行格式化pattern用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“%”进行转义
以上语句通过引用
${HIGHLIGHT_PATTERN}
,使得输出到控制台的格式为高亮日志格式
4. 定义日志文件输出参数
<!--文件输出的格式设置 --><appendername="FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false --><prudent>false</prudent><!-- 日志日常打印日志文件,生成日志示例:/logs/log-test/info.log --><file>${LOG_HOME}/info.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 压缩日志的路径和日志格式,示例:info-2023-05-26_21.log.zip,%d{yyyy-MM-dd}:表示文件名称包含日期,%i:表示当前是第几个压缩文件 --><fileNamePattern>${LOG_HOME}/info-%d{yyyy-MM-dd}_%i.log.zip</fileNamePattern><!-- 如果按天来回滚,则最大保存时间为7天,7天之前的都将被清理掉 --><maxHistory>7</maxHistory><!-- 日志总保存量为10GB,超过该日志总量的日志压缩包会被清除 --><totalSizeCap>10GB</totalSizeCap><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!--文件达到 最大100MB时会被压缩和切割 --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!-- 文件输出的日志 的格式 --><encoderclass="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender>
标签:appender
定义一个名为 “FILE” 的文件参数配置,指定appender属性class定义具体的滚动策略类class="ch.qos.logback.core.rolling.RollingFileAppender”。
RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件
标签含义prudent如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 falsefile被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值rollingPolicy当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名encoder对日志进行格式化encoder > pattern用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“%”进行转义
标签:rollingPolicy
当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。
属性class定义具体的滚动策略类class=“ch.qos.logback.core.rolling.TimeBasedRollingPolicy”。
TimeBasedRollingPolicy 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责触发滚动。
标签含义fileNamePattern必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。maxHistory滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件totalSizeCap日志总保存量为10GB,超过该日志总量的日志压缩包会被清除
标签:timeBasedFileNamingAndTriggeringPolicy
表示按时间回滚的同时,按文件大小来回滚
<!--文件达到 最大100MB时会被压缩和切割 --><maxFileSize>100MB</maxFileSize>
5. 定义日志的输出级别
<!-- 日志输出级别 --><loggername="org.springframework"level="INFO"/><loggername="com.zhou.*"level="INFO"/><rootlevel="INFO"><appender-refref="CONSOLE-WITH-HIGHLIGHT"/><appender-refref="FILE"/></root>
标签:logger
仅有一个name属性,一个可选的level和一个可选的additivity属性
- 属性name: 用来指定受此logger约束的某一个包或者具体的某一个类。
- 属性level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别
- 属性additivity: 是否向上级logger传递打印信息。默认是true。同一样,可以包含零个或多个元素,标识这个appender将会添加到这个logger
标签:root
root也是logger元素,但是它是根loger并且只有一个level属性,可以包含零个或多个元素,标识这个appender将会添加到这个loger
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG
五、测试日志打印效果
1. 日志打印级别的设置效果
设置root节点的level=“trace”,效果如下:
设置root节点的level=“error”,效果如下:
2. 日志压缩策略效果
3. 日志清除策略效果
设置压缩包大小超过10MB后自动清理
当前压缩包共占用9.77MB,当超过10MB时,日志文件名中‘_0’的日志包被删除
版权归原作者 徐州蔡徐坤 所有, 如有侵权,请联系我们删除。