Как добавить TestNGReporter в Log4j 2.x? - PullRequest
0 голосов
/ 21 марта 2019

Я перевожу 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 голосов
/ 24 марта 2019

Вы близки, но вы не добавили свои приложения в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...