Spring Boot 日志配置

Spring Boot 日志配置

日志功能需求

  • 将关键数据打印在控制台
  • 将关键数据打印在文件中
  • 日志分类,根据日志不同类型打印到不同文件
  • 不同的运行环境,打印不同的日志内容
  • 日志自动压缩、自动清理

日志的门面: SLF4J

SLF4J 只是一个门面程序,并不做具体的日志打印功能,需要整合LogBackLog4j 等第三方模块。

  • commons logging
  • jboss logging

官方文档:http://www.slf4j.org/manual.html

测试Hello World

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
public class HelloSpringBoot {
    Logger log = LoggerFactory.getLogger(HelloSpringBoot.class);
    @RequestMapping("hello")
    public String hello(){
        log.info("Hello");
        return "Hello SpringBoot";
    }
}

输出

从上面的代码中我们可以看出,如果项目中需要使用到slf4j做日志输出的话,在每一个类里面都需要定义,过于繁琐,下面我们使用 lombok 插件来实现 slf4j ,可以极大的简化我们的代码量。

在项目 pom 文件中引入 lombok 依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
</dependency>

控制器

@RestController
@Slf4j
public class HelloSpringBoot {
    @RequestMapping("hello")
    public String hello(){
        log.info("Hello");
        return "Hello SpringBoot";
    }
}

这里我们只需要在我们的类上引入一个@Slf4j 注解就可以实现slf4j日志输出功能。

自定义配置: LogBack

LogBack 特点

  • 更快的实现
  • 非常充分测试
  • 非常充分文档
  • 自动重新加载配置文件
  • 自动压缩
  • 自动去除旧的日志文件

配置 logback-spring.xml

线上环境记得修改日志的输出路径

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="5 seconds" debug="false">
    <contextName>logback</contextName>
    <!-- 配置日志输出路径(注:放到服务器上后记得更改路径) -->
    <property name="log.split.path" value="D:\\logs\\logback_demo\\" />
    <!-- 配置日志名称 -->
    <property name="log.path" value="logback.log" />
    <!-- 配置切割后的debug日志输出路径 -->
    <property name="log.debug.path" value="debug" />
    <!-- 配置切割后的info日志输出路径 -->
    <property name="log.info.path" value="info" />
    <!-- 配置切割后的warn日志输出路径 -->
    <property name="log.warn.path" value="warn" />
    <!-- 配置切割后的error日志输出路径 -->
    <property name="log.error.path" value="error" />
    <!-- 配置日志文件最大数量 -->
    <property name="log.file.max.num" value="30" />
    <!-- 配置日志文件大小最大值 -->
    <property name="log.file.max.size" value="50MB" />
    <!-- 配置总日志文件大小最大值 -->
    <property name="log.file.total.max.size" value="2GB" />

    <!-- 输出到控制台 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--配置输出日志为彩色-->
            <pattern>%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger) - %cyan(%msg%n)</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 配置debug级别日志 -->
    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 配置日志级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 配置日志存放路径 -->
        <file>${log.split.path}${log.debug.path}/${log.path}</file>
        <!-- 配置日志切割器 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 配置日志切割策略:每天切割 -->
            <fileNamePattern>${log.split.path}${log.debug.path}/log_debug_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 配置日志数量 -->
            <maxHistory>${log.file.max.num}</maxHistory>
            <!-- 配置单个日志大小的最大值 -->
            <maxFileSize>${log.file.max.size}</maxFileSize>
            <!-- 配置总日志大小的最大值 -->
            <totalSizeCap>${log.file.total.max.size}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 配置info级别日志 -->
    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 配置日志级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 配置日志存放路径 -->
        <file>${log.split.path}${log.info.path}/${log.path}</file>
        <!-- 配置日志切割器 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 配置日志切割策略:每天切割 -->
            <fileNamePattern>${log.split.path}${log.info.path}/log_info_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 配置日志数量 -->
            <maxHistory>${log.file.max.num}</maxHistory>
            <!-- 配置单个日志大小的最大值 -->
            <maxFileSize>${log.file.max.size}</maxFileSize>
            <!-- 配置总日志大小的最大值 -->
            <totalSizeCap>${log.file.total.max.size}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 配置warn级别日志 -->
    <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 配置日志级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 配置日志存放路径 -->
        <file>${log.split.path}${log.warn.path}/${log.path}</file>
        <!-- 配置日志切割器 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 配置日志切割策略:每天切割 -->
            <fileNamePattern>${log.split.path}${log.warn.path}/log_warn_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 配置日志数量 -->
            <maxHistory>${log.file.max.num}</maxHistory>
            <!-- 配置单个日志大小的最大值 -->
            <maxFileSize>${log.file.max.size}</maxFileSize>
            <!-- 配置总日志大小的最大值 -->
            <totalSizeCap>${log.file.total.max.size}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 配置error级别日志 -->
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 配置日志级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 配置日志存放路径 -->
        <file>${log.split.path}${log.error.path}/${log.path}</file>
        <!-- 配置日志切割器 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 配置日志切割策略:每天切割 -->
            <fileNamePattern>${log.split.path}${log.error.path}/log_error_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 配置日志数量 -->
            <maxHistory>${log.file.max.num}</maxHistory>
            <!-- 配置单个日志大小的最大值 -->
            <maxFileSize>${log.file.max.size}</maxFileSize>
            <!-- 配置总日志大小的最大值 -->
            <totalSizeCap>${log.file.total.max.size}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>



    <!-- 日志级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL -->
    <root level="info">
        <!-- 控制台日志 -->
        <appender-ref ref="console" />
        <!-- 按级别输出到对应文件 -->
        <appender-ref ref="debug" />
        <appender-ref ref="info"/>
        <appender-ref ref="warn"/>
        <appender-ref ref="error" />
    </root>

</configuration>

配置 application.yml

spring:
  profiles:
    active: dev
logging:
 path: D:/demolog # 设置日志储存位置

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://codeyee.com/archives/springboot-log.html