I want to have different log4j2
log directories based on the current active profile. But it does not work.
#application.properties:
spring.profiles.active=dev
log.path=d:/${spring.profiles.active}
#log4j2.xml:
<Properties>
<property name="path">${bundle:application:log.path}</property>
</Properties>
Result: a folder is created on d:/ called ${spring.profiles.active}
instead of resolving to the real spring profile name. Why?
I solved it as follows:
log4j2.xml:
${main:spring.profiles.active}
MainMapLookup.setMainArguments(new String[] {"spring.profiles.active", "dev"});
SpringApplication.run(source, args);
You can get the vmargs as follows, and set the profile dynamically before running the spring app:
ManagementFactory.getRuntimeMXBean().getInputArguments()
Or even better, coming back to this after years:
use ${sys:spring.profiles.active}
, as any arguments given with -D
count as SystemProperties. You don't need the MainMapLookup
in this case.
Result: a folder is created on d:/
called ${spring.profiles.active}
instead of resolving to the real spring profile name. Why?
There's no relation between log4j2 and Spring. The placeholder you have in your application.properties
is for Spring to parse and replace. Log4j2 is not aware of it.
You can use logging.config to set log4j2 path in application.yaml, like
---
spring:
profiles: test
logging.config: classpath:log4j2.test.yaml
---
spring:
profiles: online
logging.config: classpath:log4j2.online.yaml
with log4j2.test.yaml and log4j.online.yaml, you can set different log4j2 config in different env.