Spring Boot 整合 Logback 日志

Spring Boot 支持 Java Util Logging,Log4J,Log4J2 和 Logback 等日志框架,默认采用 Logback 日志。

在实际 Spring Boot 项目中使用 Spring Boot 默认日志配置是不能够满足实际生产及开发需求的,需要选定适合的日志输出框架,灵活调整日志输出级别、日志输出格式等。

此处主要讲述如何进行 Spring Boot 项目的 Logback 默认日志详细配置。

强烈建议使用默认的 Logback 日志配置,因为它比 log4j 性能好很多!

  1. Spring Boot 自动整合了 logback 和 log4j2,所以无需引入相关依赖。

  2. 在 resources 目录下,新建日志配置文件 logback-spring.xml

    首先,官方推荐使用的 xml 名字的格式为:logback-spring.xml 而不是 logback.xml,至于为什么,因为带 spring 后缀的可以使用 <springProfile> 这个标签(PS:这个标签用于切换“开发环境”和“生产环境”)。

    下面配置可看情况自行修改!

    本文配置参考:传送门

    <?xml version="1.0" encoding="UTF-8" ?> <!--     scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true     scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位默认单位是毫秒,当scan为true时此属性生效,默认时间间隔为1分钟     debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态,默认值为false  --> <configuration scan="true" scanPeriod="2 seconds">     <!--      	定义滚动记录文件appender 作用:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件         RollingFileAppender class="ch.qos.logback.core.rolling.RollingFileAppender"        	 参数:             <append>:如果是true日志被追加到文件结尾,如果是false清空现存文件,默认是true             <file>:被写入的文件名,可以是相对目录也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值             <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名             <triggeringPolicy>:告知RollingFileAppender合适激活滚动             <prudent>:当为true时不支持FixedWindowRollingPolicy支持TimeBasedRollingPolicy,但是有两个限制:1不支持也不允许文件压缩,2不能设置file属性必须留空     -->     <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">         <!-- 如果是true,日志被追加到文件结尾,如果是false,清空现存文件.默认是true -->         <prudent>true</prudent>         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">             <!-- 每天滚动一次的日志 只保留30天内的日志文件 -->             <fileNamePattern>logs/%d{yyyy-MM-dd}/springboot_%i.log</fileNamePattern>             <maxHistory>30</maxHistory>             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">                 <maxFileSize>10MB</maxFileSize>             </timeBasedFileNamingAndTriggeringPolicy>         </rollingPolicy>         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">             <!-- 对日志进行格式化 -->             <pattern>%date %level [%thread] %logger{10}.%class{0}#%method[%file:%line] %n%msg%n</pattern>             <charset>utf-8</charset>         </encoder>     </appender>      <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">         <prudent>true</prudent>         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">             <fileNamePattern>logs/%d{yyyy-MM-dd}/springboot-error_%i.log</fileNamePattern>             <maxHistory>30</maxHistory>             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">                 <maxFileSize>10MB</maxFileSize>             </timeBasedFileNamingAndTriggeringPolicy>         </rollingPolicy>         <encoder>             <pattern>%date %level [%thread] %logger{10}.%class{0}#%method[%file:%line] %n%msg%n</pattern>             <charset>utf-8</charset>         </encoder>         <!--              配置日志级别过滤器 作用:根据日志级别进行过滤,如果日志级别等于配置级别过滤器会根据onMath和onMismatch接收或拒绝日志              参数:              <level>:设置过滤级别              <onMatch>:用于配置符合过滤条件的操作              <onMismatch>:用于配置不符合过滤条件的操作                                        此处配置为只接收ERROR日志级别信息          -->         <filter class="ch.qos.logback.classic.filter.LevelFilter">             <level>ERROR</level>             <onMatch>ACCEPT</onMatch>             <onMismatch>DENY</onMismatch>         </filter>     </appender>      <!-- 定义控制台appender 作用:把日志输出到控制台 class="ch.qos.logback.core.ConsoleAppender" -->     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">         <layout class="ch.qos.logback.classic.PatternLayout">             <pattern>%date %level [%thread] %logger{10}.%class{0}#%method[%file:%line] %n%msg%n</pattern>         </layout>     </appender>      <!-- 将root的打印级别设置为"error",指定了名字为"console","fileAppender","errorAppender"的appender -->     <root level="error">         <appender-ref ref="console"/>         <appender-ref ref="fileAppender"/>         <appender-ref ref="errorAppender"/>     </root>      <!--         logger用来设置某一个包的日志打印级别         <loger> 仅有一个name属性,一个可选的level和一个可选的addtivity属性                 name:用来指定受此loger约束的某一个包或者具体的某一个类                 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF                 addtivity:是否向上级loger传递打印信息。默认是true,会将信息输入到root配置指定的地方,可以包含多个appender-ref,标识这个appender会添加到这个logger     -->     <logger name="com.xcbeyond.springboot" level="debug"/> </configuration> 
  3. 两种方式使用日志:

    1. 直接在需要使用日志打印的类上添加 lombok 的注解 @Slf4j 即可!

      PS:注意需要添加 Lombok 依赖!

      <!-- lombok --> <dependency>     <groupId>org.projectlombok</groupId>     <artifactId>lombok</artifactId>     <optional>true</optional> </dependency> 

      示例:

      @SpringBootTest @Slf4j class RedisMysqlDemoApplicationTests {      @Test     void contextLoads() {          // 日志级别从低到高分为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL         log.trace("================ trace =================");         log.debug("================ debug =================");         log.info("================ info =================");         log.warn("================ warn =================");         log.error("================ error =================");     } } 
    2. 声明日志类

      PS:注意 LoggerLoggerFactory 导的哪个包!

      import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest;  @SpringBootTest class RedisMysqlDemoApplicationTests {      private static final Logger log = LoggerFactory.getLogger(RedisMysqlDemoApplicationTests.class);      @Test     void contextLoads() {          // 日志级别从低到高分为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL         log.trace("================ trace =================");         log.debug("================ debug =================");         log.info("================ info =================");         log.warn("================ warn =================");         log.error("================ error =================");     } } 
发表评论

相关文章