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

标签 java jakarta-ee log4j log4j2

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

PFB 关于如何使用 log4j 实现自定义模式布局的完整细节。

测试模式布局:

public class TestPatternLayout extends PatternLayout {

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

测试模式解析器:

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

测试模式转换器:

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>

最佳答案

您只需要创建一个新的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 了解更多详情。

关于java - 如何在log4j2中实现自定义模式布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33011017/

相关文章:

java - 如何为现有代码记录List接口(interface)方法

java - session 结束后,如何在Java Web Application中自动注销用户的登录页面?

hibernate - 如何在运行简单的 hibernate 应用程序时摆脱 'java.lang.IllegalArgumentException: Unknown entity'?

java - 如何让 Ruby 程序与 Java 程序一起工作?

java - 如何将 Hudson 的 env.EXECUTOR_NUMBER 传递给 log4j 属性和 Java 的 System.getProperty

java - 找不到用于logger(log4j)的附加程序?

java - 属性文件存在,但仍然收到 "WARN No appenders could be found"

java - 枚举可以有抽象方法吗?

java - 将JAVA程序转换为PHP代码

java - SQLite:结果集返回 SQLException