Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在log4j2中实现自定义模式布局_Java_Jakarta Ee_Log4j_Log4j2 - Fatal编程技术网

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

Java 如何在log4j2中实现自定义模式布局,java,jakarta-ee,log4j,log4j2,Java,Jakarta Ee,Log4j,Log4j2,我正在将我的应用程序从log4j迁移到log4j2API。迁移时,我发现使用了自定义模式布局,模式解析器和模式转换器。我不知道如何使用log4j2插件实现这些更改。有谁能帮我把这个自定义布局testpatternalyout转换成log4j2吗。非常感谢 PFB关于如何使用log4j实现自定义图案布局的完整详细信息 测试模式布局: public class TestPatternLayout extends PatternLayout { @Override protected Patter

我正在将我的应用程序从
log4j
迁移到
log4j2
API。迁移时,我发现使用了
自定义
模式布局
模式解析器
模式转换器
。我不知道如何使用log4j2插件实现这些更改。有谁能帮我把这个自定义布局
testpatternalyout
转换成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;
 }
}
<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>
TestPatternParser:

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;
 }
}
<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>
测试模式转换器:

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;
 }
}
<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>
log4j.xml中的布局定义:

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

...
...

您只需创建一个新的
插件
并扩展
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>


了解更多详细信息。

回答得很好!是否可以使用此选项隐藏/取消隐藏throwable的消息?