Springboot-日志处理

322 阅读1分钟

日志级别

日志级别:ERROR -> WARN -> INFO -> DEBUG 如配置日志级别为INFO,则INFO及以上级别的日志会输出,而比INFO级别低的日志(debug日志)不会被输出。

引入依赖

引入spring-boot-starter,会自动引入spring-boot-starter-logging 此处额外引入lombok(可以使用@Slf4j注解):

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
</dependency>

配置文件加载顺序

Logback: 日志加载顺序:logback.xml -> application.properties -> logback-spring.xml 优先加载:logback-spring.xml SpringBoot默认使用logback,默认INFO级别

配置文件

application.yml

logging:
  config: classpath:logback-spring.xml

spring:
  application:
    name: test    #自定义应用名称

logback-spring.yml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <contextName>logback-spring-demo</contextName>
    <!--    1.自定义属性-->
    <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
    <!--    1.自定义属性:带颜色输出-->
    <property name="pattern-color"
              value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>
    <!--    日志存放目录-->
    <property name="LOG_HOME" value="logs"/>
    <!--日志文件名称:这里spring.application.name表示工程名称-->
    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>

    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!-- 控制台输出-带颜色 -->
    <appender name="CONSOLE-WITH-COLOR" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern-color}</pattern>
        </encoder>
    </appender>

    <!--按照每天生成日志文件-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--设置策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件路径:这里%d{yyyyMMdd}表示按天分类日志-->
            <FileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!--日志保留天数-->
            <MaxHistory>15</MaxHistory>
            <MaxFileSize>200MB</MaxFileSize>
        </rollingPolicy>
        <!--设置格式-->
        <encoder class="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>
            <!-- 或者使用默认配置 -->
            <!--<pattern>${FILE_LOG_PATTERN}</pattern>-->
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!--配置启用哪种appender:带颜色控制台输出+日志文件输出-->
    <root level="INFO">
        <appender-ref ref="CONSOLE-WITH-COLOR"/>
        <appender-ref ref="FILE"/>
    </root>
    <!-- logger节点可以指定具体包或类的日志配置 -->
    <!-- name属性为必选,指定要配置的包或类,level和additivity为可选,有缺省值 -->
    <!-- level表示日志级别,这里配置info级别,表示info及以上级别的日志被输出 -->
    <!-- additivity表示日志是否传递到上一级,默认为true -->
    <logger name="com.suruomo.log.TestComponent" level="info" additivity="false">
        <appender-ref ref="FILE"/>
        <appender-ref ref="CONSOLE-WITH-COLOR"/>
    </logger>

</configuration>

使用

TestComponent.java

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.time.Instant;

/**
 * @author suruomo
 * @date 2020/7/28 9:22
 * @description:
 */
@Slf4j
@Component
public class TestComponent {
   
    public static int STEP_COUNT = 10;

    public void processStep() {
        Instant start = Instant.now();
        log.info("*** TestComponent started ***");
        for (int i = 0; i < STEP_COUNT; i++) {

            log.info("  Process step {} started.", i);
            try {
                Thread.sleep(10);
                log.debug("  Process step {} detail debug message.", i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("  Process step {} completed.", i);
        }
        Instant end = Instant.now();
        log.warn("*** TestComponent completed with {} ***" + Duration.between(start, end));

    }
}

TestController.java

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author suruomo
 * @date 2020/7/28 9:29
 * @description:
 */
@RestController
public class TestController {
    @Resource
    private TestComponent testComponent;

    @GetMapping("/test")
    public String  test(){
        testComponent.processStep();
        return "成功";
    }
}

测试

输入:127.0.0.1:8070/test 自动输出日志到文件和控制台