How to implement custom template layout in log4j2

I am moving my application from log4j2 to log4j2 API. During the migration, I found custom patternlayouts , patternparsers and patternconverters . I do not know how to implement these changes using log4j2 plugins. Can someone help me on how to convert this custom TestPatternLayout layout to log4j2. Thank you very much.

PFB full details on how a custom template layout is implemented using 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; } } 

Layout definition 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> 
+5
source share
1 answer

You just need to create a new Plugin and extend the 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); } } 

and update the configuration:

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

It's all. See the log4j2 extension for more details.

+1
source

Source: https://habr.com/ru/post/1233225/


All Articles