如何将TestNGReporter添加到Log4j 2.x?

时间:2019-03-20 23:16:38

标签: testng log4j2

我正在将Log4j1.x迁移到2.x,这是我以前在1.x中拥有的。附加程序还将消息也记录到TestNG。

这是我曾经拥有的。

import org.apache.log4j.Layout;
import org.apache.log4j.spi.LoggingEvent;
import org.testng.Reporter;

public class TestNGAppender extends org.apache.log4j.ConsoleAppender {
    public TestNGAppender() {
        super();
        return;
    }

    public TestNGAppender(Layout layout) {
        super(layout);
        return;
    }

    @Override
    public void append(LoggingEvent logEvent) {
        if (super.layout != null) {
            Reporter.log(super.layout.format(logEvent));
        }

        return;
    }

    @Override
    public void close() {
        super.close();
        return;
    }
}

这就是我的附加方式

public static <T> Logger getConsoleAndTestNGLogger(Class<T> aClass) {
    Logger logger = Logger.getLogger(aClass);

    PatternLayout patternLayout = new PatternLayout("%d %5p (%F:%L) %M - %m%n");

    logger.addAppender(new TestNGAppender(patternLayout));
    logger.addAppender(new ConsoleAppender(patternLayout));

    return logger;
}

我为此创建了一个简单的测试,这就是它的打印内容

2019-03-20 10:14:03,329  INFO (LoggingUtilsTest.java:13) testGetConsoleAndTestNGLogger - Test

现在,我要迁移到Log4j2.x,这是我到目前为止所做的。

@Plugin(name = "TestNGAppender", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)
public class TestNGAppender extends AbstractAppender
{
    public TestNGAppender(String name, Layout layout)
    {
        super(name, null, layout, false);
    }

    @Override
    public void append(LogEvent logEvent)
    {
        final Layout<? extends Serializable> layout = getLayout();
        if (layout != null && layout instanceof PatternLayout) {
            Reporter.log(((PatternLayout) layout).toSerializable(logEvent));
        } else {
            Reporter.log(logEvent.getMessage().getFormattedMessage());
        }

        return;
    }

    @PluginFactory
    public static TestNGAppender createAppender(
            @PluginAttribute("name") @Required(message = "A name for the Appender must be specified") final String name,
            @PluginElement("Layout") Layout<? extends Serializable> layout)
    {
        return new TestNGAppender(name, layout);
    }
}

public static <T> Logger getConsoleAndTestNGLogger(Class<T> aClass)
{
    PatternLayout patternLayout = PatternLayout.newBuilder().withPattern("[%p] (%t) %c: %m%n").build();

    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    Configuration config = ctx.getConfiguration();

    ConsoleAppender consoleAppender = ConsoleAppender.createDefaultAppenderForLayout(patternLayout);
    consoleAppender.start();

    TestNGAppender appender = TestNGAppender.createAppender("TestNGAppender", patternLayout);

    config.addAppender(consoleAppender);
    config.addAppender(appender);

    ctx.updateLoggers();

    return LogManager.getLogger(aClass);
}

但是在运行测试以打印某些内容时,在Console或TestNG报告中没有看到任何内容。

1 个答案:

答案 0 :(得分:0)

您很接近,但是没有将附加程序添加到Logger。您需要做

Logger logger = LogManager.getLogger(aClass);
PatternLayout patternLayout = PatternLayout.newBuilder().withPattern("[%p] (%t) %c: %m%n").build();

final Configuration onfig = (LoggerContext) LogManager.getContext(false).getConfiguration();

ConsoleAppender consoleAppender = ConsoleAppender.createDefaultAppenderForLayout(patternLayout);
consoleAppender.start();

TestNGAppender appender = TestNGAppender.createAppender("TestNGAppender", patternLayout);
appender.start();
config.addLoggerAppender(logger, consoleAppender);
config.addLoggerappender(logger. appender);
return logger;