一、背景
spring项目将日志上传到阿里云,需要accessKeyId、accessKeySecret这二个值,希望从application.xml文件中读取这二个值,但试了很多次都没成功。后来了解到,spring配置文件的加载顺序如下:logback.xml -> application.properties/yml -> logback-spring.xml。刚好logback的配置文件名是logback.xml,导致配置一直不生效
二、解决方案
- 修改配置文件名,将logback.xml改成logback-spring.xml。
- 使用标签,如下所示:
<springProperty scope="context" name="变量名" source="application中的属性名" defaultValue="默认值"/>
- 代码示例子
(1)application.yml
# application.yml
spring:
application:
name: my-order-service
server:
port: 8080
myapp:
log:
path: /var/logs/myapp
(2)logback-spring.xml
<configuration>
<!-- 1. 引用 application.yml 中的属性 -->
<!-- name: 在 logback 中使用的变量名 -->
<!-- source: application.yml 中的完整属性路径 -->
<springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="unknown-app"/>
<springProperty scope="context" name="LOG_PATH" source="myapp.log.path" defaultValue="./logs"/>
<springProperty scope="context" name="SERVER_PORT" source="server.port"/>
<!-- 2. 在控制台输出格式中使用变量 -->
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [${APP_NAME}] [%thread] %-5level %logger{36} - %msg%n"/>
<!-- 控制台 Appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 3. 在文件路径中使用变量 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>