How to include Log4j2 messages in TestNG reporting

2019-03-20 16:05发布

问题:

I would like to have the Log4j2 logging information available in the TestNG reports for all of the test cases.

TestNG uses a special logger class called Reporter.java that keeps track of the log output and saves it in its results XML.

In log4j it was possible to simply create an appender implementation that routes to Reporter and register it.

With the new Logger API in Log4j2 it has been difficult to find information on how to accomplish this. I have some information to get this done using Log4j but not with Log4j2.

回答1:

From what I can tell you just need to implement a simple Appender. Something like:

@Plugin(name="Reporter", category ="Core", elementType="appender", printObject=true)
public class ReporterAppender extends AbstractAppender {

    private ReporterAppender(final String name, final Layout layout) {
        super(name, null, layout, false);
    }

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

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


回答2:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

add this in pom.xml

<dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
        <scope>compile</scope>
    </dependency>

then you can use log.info or log.error etc...