Karol B. created LOG4J2-2242:
--------------------------------

             Summary: Log4j2 - logger overrides another logger's message
                 Key: LOG4J2-2242
                 URL: https://issues.apache.org/jira/browse/LOG4J2-2242
             Project: Log4j 2
          Issue Type: Bug
    Affects Versions: 2.10.0
            Reporter: Karol B.


We are trying to migrate our application from slf4j with log4j to log4j2 
(2.10.0). We noticed a problem:

1) We call

LOGGER.warn("Message: object value is {}", object)
 from class A

2) Object overrides toString method invoking static method from other class B

3) Method that generates String representation of object use logger :

LOGGER.warn( "Used ObjectsToStringGenerator for class: {}", o.getClass() )
 We expect logs to looks like:
{code:java}
2018-02-05 06:07:25.233 [main] WARN MainClass - Message: object values is 
[object string]
 2018-02-05 06:07:25.233 [main] WARN ExampleObject - Used 
ObjectsToStringGenerator for class: class ExampleObject{code}

 But we get this:
{code:java}
2018-02-05 15:01:43.359 [main] WARN MainClass - Used ObjectsToStringGenerator 
for class: class ExampleObject[object string]
2018-02-05 15:01:43.373 [main] WARN ObjectsToStringGenerator - 
ObjectsToStringGenerator for class: ExampleObject{code}

 If we explicity invoke toString method:

LOGGER.warn("Message: object value is {}", object.toString() )
 everything is working as expected, but of course, we would like to avoid 
explicite use of object.toString(). We tried also using sync loggers/appendrs 
but we got error:

main ERROR Recursive call to appender CONSOLE.
 Below example code/logger configuration:

MainClass.java:

 
{code:java}
public class MainClass
{
    private static final Logger LOGGER = LogManager.getLogger( MainClass.class 
);
    public static void main(String[] args) throws InterruptedException {
     //...
      LOGGER.warn( "Message: object value is {}", new ExampleObject() );
      //...
   }
}
{code}

 ExampleObject.java:

 
{code:java}
public class ExampleObject
{
  @Override
  public String toString()
  {
     return ObjectsToStringGenerator.getStringValue( this ); 
  }
}
{code}

 ObjectsToStringGenerator.java:

 
{code:java}
public class ObjectsToStringGenerator
{
   private static final Logger LOGGER = LogManager.getLogger(    
ObjectsToStringGenerator.class );
  public static String getStringValue(Object o){
    LOGGER.warn( "Used ObjectsToStringGenerator for class: {}", o.getClass() );
    return "[object string]";
  }
}
{code}

 The configuration file (we tested this also in RollingFile appender and our 
custom implementation with the same result):

 
{code:java}
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
 <Appenders>
   <Console name="CONSOLE" target="SYSTEM_OUT">
     <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}[%t] %p %c{2}- %m%n" />
   </Console>
 </Appenders>
 <Loggers>
    <Root level="debug">
      <AppenderRef ref="CONSOLE" />
    </Root>
 </Loggers>
</Configuration>
{code}
 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to