2015-10-08 15 views
5

Sto migrando la mia applicazione da log4j a log4j2 API. Durante la migrazione, ho trovato custompatternlayouts, patternparsers e patternconverters. Non sono a conoscenza di come implementare queste modifiche utilizzando i plugin log4j2. Qualcuno può aiutarmi su come convertire questo layout personalizzato TestPatternLayout a log4j2. Grazie molto.Come implementare il layout personalizzato del modello in log4j2

PFB i dettagli completi su come il layout del modello personalizzato è implementato utilizzando log4j.

TestPatternLayout:

public class TestPatternLayout extends PatternLayout { 

@Override 
protected PatternParser createPatternParser(String pattern) { 
    return new TestPatternParser(pattern); 
} 
} 

TestPatternParser:

public class TestPatternParser extends PatternParser { 

private static final char Test_CHAR = 'e'; 
private static final char DATETIME_CHAR = 'd'; 

public TestPatternParser(String pattern) { 
    super(pattern); 
} 

@Override 
protected void finalizeConverter(char c) { 
    switch (c) { 
     case Test_CHAR: 
      currentLiteral.setLength(0); 
      addConverter(new TestPatternConverter()); 
      break;    
     default: 
      super.finalizeConverter(c); 
    } 
} 
} 

TestPatternConverter:

public class TestPatternConverter extends PatternConverter { 

@Override 
protected String convert(LoggingEvent event) { 
    String testID = ObjectUtils.EMPTY_STRING; 
    if(TestLogHandler.isTestLogEnabled()) { 
     TestContextHolder contextHolder = TestLogHandler.getLatestContextHolderFromStack(event.getThreadName()); 
     if(contextHolder != null) { 
      testID = contextHolder.getTestIDForThread(event.getThreadName()); 
     } 
     else{ 
      testID = TestContextHolder.getTestIDForThread(event.getThreadName()); 
     } 
    } 
    return testID; 
} 
} 

definizione di layout in log4j.xml:

<appender name="TEST_LOG_FILE" class="org.apache.log4j.RollingFileAppender"> 
... 
    <layout class="com.test.it.logging.TestPatternLayout"> 
     <param name="ConversionPattern" value="%d %-5p [%c{1}] [TestId: %e] [%t] %m%n"/> 
</layout> 
... 
</appender> 

risposta

1

Hai solo bisogno di creare un nuovo Plugin ed estendere LogEventPatternConverter:

@Plugin(name = "TestPatternConverter", category = PatternConverter.CATEGORY) 
@ConverterKeys({"e"}) 
public final class TestPatternConverter extends LogEventPatternConverter { 

    /** 
    * Private constructor. 
    * @param options options, may be null. 
    */ 
    private TestPatternConverter(final String[] options) { 
     super("TestId", "testId"); 
    } 

    /** 
    * Obtains an instance of pattern converter. 
    * 
    * @param options options, may be null. 
    * @return instance of pattern converter. 
    */ 
    public static TestPatternConverter newInstance(final String[] options) { 
     return new TestPatternConverter(options); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public void format(final LogEvent event, final StringBuilder toAppendTo) { 
     String testID = ObjectUtils.EMPTY_STRING; 
     if(TestLogHandler.isTestLogEnabled()) { 
      TestContextHolder contextHolder = TestLogHandler.getLatestContextHolderFromStack(event.getThreadName()); 
      if(contextHolder != null) { 
       testID = contextHolder.getTestIDForThread(event.getThreadName()); 
      } 
      else{ 
       testID = TestContextHolder.getTestIDForThread(event.getThreadName()); 
      } 
     } 
     toAppendTo.append(testID); 
    } 
} 

e aggiornare la configurazione:

<Appender type="RollingFile" name="TEST_LOG_FILE" fileName="${filename}"> 
     <Layout type="PatternLayout"> 
     <Pattern>%d %-5p [%c{1}] [TestId: %e] [%t] %m%n</Pattern> 
     </Layout> 
</Appender> 

che dovrebbero essere tutti. Si prega di vedere Extending log4j2 per maggiori dettagli.

Problemi correlati