Hi Thorsten,
On 6.05.2025 09:46, Thorsten Schöning wrote:
I have the following two configs, which seem to behave the same:
```xml
<Routing name="[...]">
<Routes pattern="$${ctx:foo}">
<Route key="true" ref="RollingFileFoo" />
<Route key="$${ctx:foo}" ref="RollingFile" />
</Routes>
</Routing>
```
vs.
```xml
<Routing name="[...]">
<Routes pattern="$${ctx:foo}">
<Route key="true" ref="RollingFileFoo" />
<Route key="${ctx:foo}" ref="RollingFile" />
</Routes>
</Routing>
```
I'm a bit confused which the correct value is because both seem to work exactly
the same. Which shouldn't happen if the `key` attribute implements an equals
comparison to it's value.
There is subtle difference between the two configurations:
* In the first case the value of `key` will always be a literal
`${ctx:foo}`.
* In the second case Log4j Core will expand `${ctx:foo}` at
configuration time. Since the configuration of Log4j Core happens
very early in the startup sequence, `foo` will almost certainly be
undefined, so `key` will be a literal `${ctx:foo}`. In the very
unlikely case `foo` is defined at configuration time, however, the
value of `foo` will be substituted and your configuration will not
work as expected.
To see the difference, try adding:
static {
ThreadContext.put("foo", "true");
}
private static final Logger logger = LogManager.getLogger();
at the very beginning of the main class of your application.
Piotr