K P created LOG4J2-3480:
---------------------------
Summary: Changed behaviour (regression) in 2.17.2 lookup plugin or
string interpolation
Key: LOG4J2-3480
URL: https://issues.apache.org/jira/browse/LOG4J2-3480
Project: Log4j 2
Issue Type: Bug
Components: Core
Affects Versions: 2.17.2
Reporter: K P
Something (breaking) changed in the way lookups and/or string interpolation is
done, between versions 2.17.1 and {*}2.17.2{*}.
Our situation has some complexities (for historical reason):
* we can use {_}either a configuration via log4j2.xml file{_},
or either the same _config built programmatically_
* we have a {_}custom lookup plugin{_}. Let's call it "foo" for the purpose of
illustration:
{{@Plugin(name = "foo", category = "Lookup")}}
The lookup has a few keys.
* e.g.: _${foo:version}_ , _${foo:options}_ , etc.
(reason or underlying implementation doesn't matter here - something to do with
context based on dynamic modules, threadgroups, etc)
* The lookup also has the keys _${foo:header}_ and _${foo:footer}_ , which
contains a larger snippet, INCLUDING some of its other keys.
e.g. (simplified adapted example)
"{{{}Here some header text for version {*}$${*}{foo:version} at {*}$${*}{date}
etc etc{}}}"
These double $$ are important here , see further below.
Then we have in our <PatternLayout> configuration the following:
{{ <PatternLayout>}}
{{ <Pattern>... omitted here ...</Pattern<}}
{{ <Header>${foo:header}</Header>}}
{{ <Footer>${foo:footer}</Footer>}}
As a result, each logfile is started with the well-defined header snippet (this
string hard-coded inside the lookup plugin), but that header has some variable
content (${foo:version}, ${foo:options}, ${date} ), which is substituted in
turn. And each logfile is terminated by the foo:footer. Having this header and
footer defined by the lookup ensures that the end-user easily configures them
in the fixed header and footer in his log4j2.xml.
Now in our application we also allow a +programmatically built log+
configuration:
{{ builder.newLayout("PatternLayout")}}
{{ .addAttribute("header", HEADER)}}
{{ .addAttribute("header", FOOTER)}}
whereby HEADER and FOOTER are the same strings as returned by our custom foo
lookup plugin when it returns foo:header and foo:footer. (i.e. containing the
double $$ inside)
+Why the double $$ ?+
We have these since many years: The double $$ ensure that the lookups included
inside the header and footer (e.g. $${foo:version}, but also the $${date} )
+are evaluated at the time that the logfile is actually being written+ !
If instead we used a single $ inside the header and footer, the interpolation
happened only 1x at time of configuration. Which is not what we want.
e.g. when using a single $, then the timestamp in the header was stuck to the
timestamp at the time that our application _loaded the logging config._ Whereas
of course we'd want the timestamp to be current at the time the new logfile was
created.
If I remember well, the same was true for our custom lookup: to ensure it being
{+}re{+}-evaluated at the time the logfile was written, we needed to use a
double $$.
Now this {+}worked fine up until log4j 2.17.1{+}.
+both+ with our _programmatic_ configuration or when configured via _log4j2.xml_
This _still_ works in log4j 2.17{*}.2{*} when we are running with our
*programmatically* built configuration:
However, in log4j 2.17.2 this *no longer* works when the configuration is taken
from the *log4j2.xml* file.
In that case, the expansion of double $${...} no longer works.
Instead, it just prints something like: "{{{}Here some header text for version
${foo:version} at ${date} etc{}}}"
i.e. the double $$ is substituted by a single $ now, but now further
substitution are done. Not at load time, not later at write time.
On the other hand, when in the header string, I now use $ inside $$, then this
now suddenly works in the log4j2.xml-based configuration with substitution at
write-time. Which is clearly a different behavior than up to log4j 2.17.1. And
is also a different behavior than the programmatic configuration.
So there's clearly +something+ has changed unexpectedly in log4j 2.17.2...
I don't know which change or jira issue may have caused it ?
Could it have something to do with, which did some changes in the string
interpolation? LOG4J2-3424 ?
Or can it be related to e.g. LOG4J2-3470 ?
Something else?
I did try using the 2.17.3-SNAPSHOT, but I am still seeing the changed 2.17.2
behavior there...
--
This message was sent by Atlassian Jira
(v8.20.1#820001)