多模块Maven项目下,如何通过Spring Cloud Config Server集中管理Log4j2配置
问题背景
我正在使用Spring Cloud Config Server文件系统后端,项目是多模块Maven结构,当前每个模块都在src/main/resources下存放log4j2-spring.yaml,希望将该文件移至Config Server的cloud_config目录实现集中管理,但发现日志配置文件似乎必须放在模块自身的资源目录下,求解决办法。
项目结构如下:
project: ├── pom.xml │ ├── project-config-provider │ ├── pom.xml │ ├── src │ │ └── main │ │ ├── java │ │ │ └── com │ │ │ └── company │ │ │ └── project │ │ │ └── config_provider │ │ │ └── Application.java │ │ └── resources │ │ └── log4j2-spring.yaml │ │ │ ├── config │ │ ├── application_config-provider--native.yaml │ │ └── application_config-provider--aws.yaml │ │ │ └── cloud_config │ ├── application-config_main.yaml │ ├── application-config_storage.yaml │ ├── application-config_swagger.yaml │ └── application-env_local.yaml │ └── project-abc ├── pom.xml ├── src │ └── main │ ├── java │ │ └── com │ │ └── company │ │ └── project │ │ └── abc │ │ └── AbcApplication.java │ └── resources │ └── log4j2-spring.yaml │ └── config └── application_abc.yaml
关键配置文件内容
Config Server本地环境配置(application_config-provider--native.yaml)
spring: application: name: config-provider profiles: active: native include: config_main cloud: config: server: native: search-location: cloud_config prefix: /config bootstrap: true server.port: 8888
客户端模块配置(application_abc.yaml)
spring: application: name: maps version: 1.0.0 profiles: include: config_main, config_storage, config_swagger config: import: configserver:http://${CONFIG_PROVIDER_HOST:localhost}:${CONFIG_PROVIDER_PORT:8888}/config
解决方案
1. 迁移日志配置文件到Config Server
直接把各模块src/main/resources下的log4j2-spring.yaml移动到project-config-provider/cloud_config目录下,保持文件名不变。
2. 让客户端加载Config Server上的日志配置
Spring Boot默认优先读取本地资源目录的日志配置,可通过以下两种方式指定从Config Server加载:
方式一:启动参数指定日志路径
在客户端模块的启动参数中添加:
-Dlogging.config=http://${CONFIG_PROVIDER_HOST:localhost}:${CONFIG_PROVIDER_PORT:8888}/config/maps/default/log4j2-spring.yaml
其中maps是客户端的spring.application.name,default为默认环境,若使用特定环境则替换为对应环境名。
方式二:客户端配置文件动态指定
修改application_abc.yaml,添加日志配置路径:
spring: application: name: maps version: 1.0.0 profiles: include: config_main, config_storage, config_swagger config: import: configserver:http://${CONFIG_PROVIDER_HOST:localhost}:${CONFIG_PROVIDER_PORT:8888}/config # 动态拼接日志配置路径 logging: config: ${spring.config.import.replace('configserver:', '')}/maps/${spring.profiles.active:default}/log4j2-spring.yaml
这种方式通过Spring表达式自动拼接Config Server地址,无需硬编码。
3. 处理Config Server自身的日志配置
Config Server启动时还未连接到自身配置服务,因此需要在src/main/resources下保留一份极简日志配置,仅用于启动阶段输出,启动完成后会自动加载cloud_config中的完整配置。
极简本地日志配置示例:
Configuration: status: warn Appenders: Console: name: Console target: SYSTEM_OUT PatternLayout: pattern: "%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" Loggers: Root: level: info AppenderRef: ref: Console
4. 验证配置
启动Config Server后再启动project-abc模块,检查日志输出是否符合cloud_config中log4j2-spring.yaml的配置,同时确认客户端模块已删除本地日志文件且运行正常。
内容的提问来源于stack exchange,提问作者Paul Marcelin Bejan

