Spring Boot 教程

Spring Boot 笔记

spring boot logback 多环境配置的两种方式

Spring Boot 笔记 Spring Boot 笔记


spring boot 自带多个 log 实现,其中也包括 logback,往往开发中,开发者需要根据环境,对日志有不一样的配置操作,如不希望线上出现 debug 日志,测试环境可以出现 debug 日志等等。

配置方法

由于 spring boot 自带多个 log 实现,首先需要将其余实现排除掉。

若 gradle 管理的项目,添加如下代码:

configurations {
    compile.exclude module: 'slf4j-log4j12'
    compile.exclude module: 'log4j-over-slf4j'
    compile.exclude module: 'slf4j-nop'
    compile.exclude module: 'spring-boot-starter-json'
}

如果是 maven 构建的项目,全局排除 spring boot log 有些小麻烦,spring boot 的很多 starter 都包含 spring-boot-starter-logging,它主要包含了 logback、log4j-to-slf4j 及 jul-to-slf4j 的实现,需要排除其余两项,具体如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-to-slf4j</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

在完成了 logback jar 包的正确导入之后,开始配置 logback.xml。

不同环境主要有两种配置方法,一种是每个环境单独一个类似 logback-{env}.xml 文件,另一种是在 logback.xml 文件内部利用 springProfile 标签分开配置

如上两种方法前提都是服务启动是设置 spring.active.profiles 参数,该选项是指定服务当前的环境,如常用的 local、dev、test、staging 和 prod 等。

第一种方法,spring boot 会根据不同环境加载 logback-{evn}.xml 配置项。

第二种方法,具体示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!-- 控制台日志 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M %L - %msg %n</Pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!-- 文件日志 -->
    <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M %L - %msg %n</Pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/file.%d{yyyyMMdd}.log</fileNamePattern>
        </rollingPolicy>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!-- 错误日志 -->
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M %L - %msg %n</Pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/error.%d{yyyyMMdd}.log</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- server log -->
    <appender name="serverLogFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>server_log/server_log.%d{yyyyMMdd}.log</fileNamePattern>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <springProfile name="dev,pre,prod">
        <logger name="serverLogger" additivity="false">
            <appender-ref ref="serverLogFileAppender"/>
        </logger>

        <root level="INFO">
            <appender-ref ref="fileAppender"/>
            <appender-ref ref="consoleAppender"/>
            <appender-ref ref="errorAppender"/>
        </root>
    </springProfile>

    <springProfile name="local">
        <root level="INFO">
            <appender-ref ref="consoleAppender"/>
        </root>
    </springProfile>

</configuration>