《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>