spring的logback引用application配置文件的变量

一、背景

spring项目将日志上传到阿里云,需要accessKeyId、accessKeySecret这二个值,希望从application.xml文件中读取这二个值,但试了很多次都没成功。后来了解到,spring配置文件的加载顺序如下:logback.xml -> application.properties/yml -> logback-spring.xml。刚好logback的配置文件名是logback.xml,导致配置一直不生效

二、解决方案

  1. 修改配置文件名,将logback.xml改成logback-spring.xml。
  2. 使用标签,如下所示:
ini 复制代码
<springProperty scope="context" name="变量名" source="application中的属性名" defaultValue="默认值"/>
  1. 代码示例子

(1)application.yml

yaml 复制代码
# application.yml
spring:
  application:
    name: my-order-service
server:
  port: 8080
myapp:
  log:
    path: /var/logs/myapp

(2)logback-spring.xml

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>
相关推荐
陈随易38 分钟前
VSCode的Copilot扩展支持接入DeepSeek,Kimi了!
前端·后端·程序员
我不是外星人2 小时前
有了 Harness Engineering ,真的还需要研发工程师吗?
前端·后端·ai编程
candyTong2 小时前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
Rust研习社4 小时前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
IT_陈寒5 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
CaffeinePro5 小时前
Pydantic深度使用:数据校验、枚举、ORM映射
后端·fastapi
Chenyiax6 小时前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端
MariaH6 小时前
Koa和Express的区别
后端
MariaH6 小时前
Koa框架的使用
后端
luckdewei7 小时前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端