【问题标题】:How to implement custom pattern layout in log4j2如何在 log4j2 中实现自定义模式布局
【发布时间】:2016-01-05 19:03:15
【问题描述】:

我正在将我的应用程序从 log4j 迁移到 log4j2 API。在迁移时,我发现使用了custompatternlayoutspatternparserspatternconverters。我不知道如何使用 log4j2 插件来实现这些更改。任何人都可以帮助我如何将此自定义布局TestPatternLayout 转换为 log4j2。非常感谢。

PFB 关于如何使用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;
 }
}

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>

【问题讨论】:

    标签: java jakarta-ee log4j log4j2


    【解决方案1】:

    您只需要创建一个新的Plugin 并扩展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);
        }
    }
    

    并更新您的配置:

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

    应该就是这样。请看Extending log4j2 了解更多详情。

    【讨论】:

    • 很好的答案!可以使用这个隐藏/取消隐藏 throwable 的消息吗?
    猜你喜欢
    • 1970-01-01
    • 2017-04-07
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多