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

Remko Popma updated LOG4J2-1368:
--------------------------------
    Description: 
Internal log4j logging like below will just log the message but will not report 
the specified exception:
{code}
try {
    someProcess();
} catch (Exception exception) {
    StatusLogger.getLogger().warn("error occurred during {}", "some process", 
exception);
}
{code}

This is caused by a bug in ParameterizedNoReferenceMessageFactory (the factory 
used by StatusLogger):

{code}
final String formatted = new ParameterizedMessage(message, 
params).getFormattedMessage();
return new SimpleMessage(formatted); // exception is dropped
{code}

This factory was introduced to resolve memory leaks that appeared in web 
containers because StatusLogger keeps a ring buffer of previously logged 
messages and ParameterizedMessage keeps a reference to its parameter objects 
(LOG4J2-1176).

AbstractLogger depends on the Message to get the Throwable when logging a 
message with parameters, so SimpleMessage is not good enough. I'm thinking to 
introduce a new class {{StatusMessage}} (perhaps as an inner class of 
ParameterizedNoReferenceMessageFactory in order to keep the API surface small). 
StatusMessage would have the formatted string and the Throwable (which may be 
null). That should solve this issue.

If the Throwable is a custom Log4j class like AppenderLoggingException then 
keeping a reference to it may re-introduce memory leaks again though, but I 
guess that is a fight for another day...

  was:
Internal log4j logging like this:
{code}
StatusLogger.getLogger().warn("error occurred during {}", "some process", 
exception);
{code}

This will just log the message but will not report the specified exception.

There is a bug in ParameterizedNoReferenceMessageFactory (the factory used by 
StatusLogger):

{code}
final String formatted = new ParameterizedMessage(message, 
params).getFormattedMessage();
return new SimpleMessage(formatted); // exception is dropped
{code}





> Status logger drops/ignores exception
> -------------------------------------
>
>                 Key: LOG4J2-1368
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-1368
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: API
>    Affects Versions: 2.5
>            Reporter: Remko Popma
>
> Internal log4j logging like below will just log the message but will not 
> report the specified exception:
> {code}
> try {
>     someProcess();
> } catch (Exception exception) {
>     StatusLogger.getLogger().warn("error occurred during {}", "some process", 
> exception);
> }
> {code}
> This is caused by a bug in ParameterizedNoReferenceMessageFactory (the 
> factory used by StatusLogger):
> {code}
> final String formatted = new ParameterizedMessage(message, 
> params).getFormattedMessage();
> return new SimpleMessage(formatted); // exception is dropped
> {code}
> This factory was introduced to resolve memory leaks that appeared in web 
> containers because StatusLogger keeps a ring buffer of previously logged 
> messages and ParameterizedMessage keeps a reference to its parameter objects 
> (LOG4J2-1176).
> AbstractLogger depends on the Message to get the Throwable when logging a 
> message with parameters, so SimpleMessage is not good enough. I'm thinking to 
> introduce a new class {{StatusMessage}} (perhaps as an inner class of 
> ParameterizedNoReferenceMessageFactory in order to keep the API surface 
> small). StatusMessage would have the formatted string and the Throwable 
> (which may be null). That should solve this issue.
> If the Throwable is a custom Log4j class like AppenderLoggingException then 
> keeping a reference to it may re-introduce memory leaks again though, but I 
> guess that is a fight for another day...



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to