java 如何在log4j2中实现自定义模式布局

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33011017/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 21:04:24  来源:igfitidea点击:

How to implement custom pattern layout in log4j2

javajakarta-eelog4jlog4j2

提问by sridhar

I am migrating my application from log4jto log4j2API. While migration, I found custompatternlayouts, patternparsersand patternconvertersare used. I am not aware of how to implement these changes using log4j2 plugins. Can anyone help me on how to convert this custom layout TestPatternLayoutto log4j2. Many thanks.

我从我的迁移应用log4jlog4j2API。虽然移民,我发现custompatternlayoutspatternparserspatternconverters使用。我不知道如何使用 log4j2 插件实现这些更改。任何人都可以帮助我了解如何将此自定义布局转换TestPatternLayout为 log4j2。非常感谢。

PFB the complete details on how custom pattern layout is implemented using log4j.

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

Layout definition in log4j.xml:

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>

回答by Anton Balaniuc

You just need to create a new Pluginand extend LogEventPatternConverter:

您只需要创建一个 newPlugin和 extend 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 your 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>

That should be all. Please see Extending log4j2for more details.

这应该是全部。 有关更多详细信息,请参阅扩展 log4j2