如何在log4j2.json中使用.properties文件定义的属性?
首先排查最容易忽略的低级错误:你在dev.properties里定义的属性是fr.xyz.pathLog,但配置时用的是${fr.xyz.path}——属性名少了Log后缀,这肯定无法被识别,先修正这个拼写问题。
如果修正后仍不生效,核心原因是Log4j2默认不会自动读取Spring的dev.properties文件属性,以下是几种可行的解决方式:
方法一:将Spring属性注入系统属性
在Spring配置类中,把目标属性加载到系统环境变量里,让Log4j2能通过系统属性读取到:
@Configuration @PropertySource("classpath:dev.properties") public class AppConfig { @Autowired private Environment env; @PostConstruct public void initSystemProperties() { String logPath = env.getProperty("fr.xyz.pathLog"); System.setProperty("fr.xyz.pathLog", logPath); } }
之后在log4j2.json中直接使用${fr.xyz.pathLog}即可引用该路径。
方法二:让Log4j2直接读取properties文件
在log4j2.json中配置Properties组件,指定加载dev.properties,再通过bundle:前缀引用属性:
{ "configuration": { "properties": { "property": [ { "name": "devProps", "value": "classpath:dev.properties" } ] }, "appenders": { "File": { "name": "FileAppender", "fileName": "${bundle:devProps:fr.xyz.pathLog}/app.log" } }, "loggers": { "root": { "level": "info", "appender-ref": { "ref": "FileAppender" } } } } }
这里bundle:devProps:fr.xyz.pathLog的格式是:bundle:【自定义的properties资源名】:【属性键】。
方法三:Spring Boot场景简化方案
如果你的应用是Spring Boot且引入了spring-boot-starter-log4j2依赖,直接在log4j2.json中用${spring:fr.xyz.pathLog}就能引用Spring环境中的属性;或者在dev.properties里定义logging.file.path=${fr.xyz.pathLog},让Spring Boot自动传递给Log4j2。
注意:普通Spring应用要确保dev.properties已通过@PropertySource注解或XML的<context:property-placeholder>正确加载到Spring环境中。
内容的提问来源于stack exchange,提问作者James

