[ 
https://issues.apache.org/jira/browse/LOG4J2-3480?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

K P updated LOG4J2-3480:
------------------------
    Description: 
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...

  was:
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...


> 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
>            Priority: Major
>              Labels: interpolation, lookup, regression
>
> 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)

Reply via email to