2015-10-08 43 views
5

Przenoszę moją aplikację z interfejsu API log4j do log4j2. Podczas migracji zostały użyte: patternlayouts,Nie wiem, jak wprowadzić te zmiany za pomocą wtyczek log4j2. Czy ktoś może mi pomóc, jak przekonwertować ten niestandardowy układ TestPatternLayout do log4j2. Wielkie dzięki.Jak zaimplementować niestandardowy układ wzorów w log4j2

PFB zawiera szczegółowe informacje na temat implementacji niestandardowego układu wzorów za pomocą 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; 
} 
} 

definicja Układ w 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> 

Odpowiedz

1

Wystarczy utworzyć nową Plugin i przedłużyć 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); 
    } 
} 

i zaktualizować konfigurację:

<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> 

To powinno być wszystko. Więcej informacji można znaleźć pod numerem Extending log4j2 .