Spring Boot 整合 logback 实现不同环境配置不同的日志级别

  《IDEA 创建简单的 SpringBoot 工程(含设置 HTTP Proxy 网络代理)》一文中介绍了 Idea 创建 Spring Boot 工程的步骤。Spring Boot 对各类日志组件进行了集成,使用起来非常便捷。实际在项目配置日志输出时,有些参数需要根据不同的部署环境来设置不同的取值,例如,生产环境日志输出级别为 INFO,开发环境日志输出级别为 DEBUG。本文以 logback 为例,举例说明如何配置实现不同的环境配置不同的参数。

方法一、读取 spring 配置文件中的值

  《Spring Boot 使用 spring.profiles.active 来区分不同环境配置》一文中,介绍了 Spring Boot 配置不同环境参数的方法,本文可以将不同环境的日志级别设置到不同环境的配置文件中,然后用 spring.profiles.active 来指定使用哪种环境的参数。
  logback.xml 早于 application.yml 加载,logback-spring.xml 晚于 application.yml 加载,如果 logback 配置需要使用 application.yml 中的属性,需要命名为 logback-spring.xml。
  本文中采用 logback-spring.xml 文件来读取配置文件 application-${profile}.properties 中的属性值。logback 需要使用 <springProperty> 标签才可使用 application.properties 中的属性,当配置文件中不存在属性值时,也可以设置默认值,示例如下所示。

<!-- 读取 application.properties 中的 log.level 属性,如果没有配置,默认 INFO -->
<springProperty name="LOG_LEVEL" source="log.level" defaultValue="INFO"/>

<logger name="com.test.svc" level="${LOG_LEVEL}" additivity="false">
        <appender-ref ref="ASYNC"/>
        <appender-ref ref="STDOUT"/>
    </logger>
方法二、加载指定的配置模块

  如下配置中,<springProfile name=“dev”> 中的 name,读取的是 spring.profiles.active 配置项的值,不设置默认为 default。
  如下两条的意思是,当 spring.profiles.active 配置为 dev 的时候,包裹在其中的部分配置被加载。当 spring.profiles.active 没有配置,或者配置为 default 的时候,包裹在其中的日志设置内容被加载。如果有其他环境 test、prod、release 等,仿照如此配置即可。name 后面还可以跟表达式。

<springProfile name="dev">
        <!-- 开发环境时激活 -->
        <logger name="com.test.svc" level="DEBUG" additivity="false">
            <appender-ref ref="ASYNC"/>
            <appender-ref ref="STDOUT"/>
        </logger>
</springProfile>
<springProfile name="default">
        <!-- 默认环境时激活 -->
        <logger name="com.test.svc" level="INFO" additivity="false">
            <appender-ref ref="ASYNC"/>
            <appender-ref ref="STDOUT"/>
        </logger>
</springProfile>
附录:附上一份较为完善的 logback-spring.xml 配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty name="log_dir" source="log_dir" defaultValue="D:/logs"/>
    <springProperty name="maxHistory" source="maxHistory" defaultValue="50"/>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滚 daily -->
            <fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/debug.%i.log.zip</fileNamePattern>
            <!--文件达到最大 128MB 时会被切割和压缩 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>128MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 历史日志最大保留 50 天 -->
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %X{req.remoteHost} %X{req.requestURI} %X{req.queryString} [%X{logId}] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <!-- 异步输出 -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志,默认的,如果队列的 80% 已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能,默认值为256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="FILE"/>
    </appender>
    <!-- 日志打印到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <springProfile name="dev">
        <!-- 开发环境时激活 -->
        <logger name="com.test.svc" level="DEBUG" additivity="false">
            <appender-ref ref="ASYNC"/>
            <appender-ref ref="STDOUT"/>
        </logger>
    </springProfile>
    <springProfile name="test">
        <!-- 测试环境时激活 -->
        <logger name="com.test.svc" level="INFO" additivity="false">
            <appender-ref ref="ASYNC"/>
            <appender-ref ref="STDOUT"/>
        </logger>
    </springProfile>

    <logger name="root" level="ERROR">
        <appender-ref ref="ASYNC"/>
    </logger>
</configuration>
参考文档:

猜你喜欢

转载自blog.csdn.net/piaoranyuji/article/details/110389773