Spring Boot 教程

Spring Boot 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/spring_boot-logback-different-env-config.html

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>