Logs not reflecting in report portal after integrating with log4j2

3.1k Views Asked by At

We have a testing framework (gauge) setup and we use slf4j with log4j for logging. Recently we implemented report portal for reporting purposes and it works as expected. It shows cases executed, passed, failed and failures cases has log shown inside them.

But I can't seem to configure logs to be shown at the launch level. enter image description here

I followed this: "https://github.com/reportportal/logger-java-log4j" where I configured log4j2.xml file as shown but logs are not getting reflected in report portal. I'm able to print logs in console by changing the appender in log4j2.xml file though. So I'm guessing I'm doing something wrong with the setup.

This is the log4j2.xml file

<?xml version="1.0" encoding="UTF-8"?>
<configuration packages="com.epam.ta.reportportal.log4j.appender">
    <properties>
        <property name="pattern">[%d{HH:mm:ss}] %-5p (%F:%L) - %m%n</property>
    </properties>
    <appenders>
        <ReportPortalLog4j2Appender name="ReportPortalAppender">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </ReportPortalLog4j2Appender>
    </appenders>
    <loggers>
        <root level="debug">
            <appender-ref ref="ReportPortalAppender"/>
        </root>
    </loggers>
</configuration> 

I have added the following maven dependencies - slf4j-api,logger-java-log4j,-slf4j-impl,log4j-api,log4j-core

Let me know if I need to give more details for debugging.

Update: Problem not solved I have given up on this; but after quite sometime have to come back for it. This time I have done some changes, which also did not help. This is the logger class I use:

public class AutomationLogger {

private Logger logger;

public static AutomationLogger getLogger(Class loggerClass) {
    return new AutomationLogger(loggerClass);
}

private AutomationLogger(Class loggerClass) {
    logger = LoggerFactory.getLogger(loggerClass);
}

public void debug(String log, Object... objects) {
    log = MessageFormat.format(Thread.currentThread().getStackTrace()[2].getLineNumber() + " - Thread-" + Thread.currentThread().getId() + " [Scenario: {0}] Message: {1} Objects: {2}", Helper.getScenarioNameFromScenarioStore(), log, Arrays.toString(objects));
    logger.debug(log);
}

public void info(String log, Object... objects) {
    log = MessageFormat.format(Thread.currentThread().getStackTrace()[2].getLineNumber() + " - Thread-" + Thread.currentThread().getId() + " [Scenario: {0}] Message: {1} Objects: {2}", Helper.getScenarioNameFromScenarioStore(), log, Arrays.toString(objects));
    logger.info(log);
}

public void error(String log, Object... objects) {
    log = MessageFormat.format(Thread.currentThread().getStackTrace()[2].getLineNumber() + " - Thread-" + Thread.currentThread().getId() + " [Scenario: {0}] Message: {1} Objects: {2}", Helper.getScenarioNameFromScenarioStore(), log, Arrays.toString(objects));
    logger.error(log);
}

}

This is log4j.properties file:

# Root logger option
log4j.rootLogger=DEBUG, console

# Direct log messages to console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%m%n
# Log messages to Report Portal
log4j.appender.reportportal=com.epam.ta.reportportal.log4j.appender.ReportPortalAppender
log4j.appender.reportportal.layout=org.apache.log4j.PatternLayout
log4j.appender.reportportal.layout.ConversionPattern=[%d{HH:mm:ss}] %-5p (%F:%L) - %m%n

I have added a listener and some more dependencies in pom.xml (these are added in correct places, here I'm just pasting them without order):

<repository>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
        <id>bintray-epam-reportportal</id>
        <name>bintray</name>
        <url>http://dl.bintray.com/epam/reportportal</url>
    </repository>
<dependency>
        <groupId>com.epam.reportportal</groupId>
        <artifactId>agent-java-testng</artifactId>
        <version>5.0.9</version>
    </dependency>
    <dependency>
        <groupId>com.epam.reportportal</groupId>
        <artifactId>logger-java-log4j</artifactId>
        <version>5.0.3</version>
    </dependency>
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M5</version>
            <configuration>
                <properties>
                    <property>
                        <name>usedefaultlisteners</name>
                        <value>false</value> <!-- disabling default listeners is optional -->
                    </property>
                    <property>
                        <name>listener</name>
                        <value>com.epam.reportportal.testng.ReportPortalTestNGListener</value>
                    </property>
                </properties>
            </configuration>
        </plugin>

I use logger in tests as below:

AUTOMATION_LOGGER.info("Key=> " + key, "\nExpected Value: " + expectedMap.get(key) + "\nActual Value: " + actualMap.get(key));

Still I don't see the log in report portal. Only the stack trace gets printed. The 'AUTOMATION_LOGGER' statements don't get printed in report portal. Please suggest what more is needed.

Thanks, Rahul

2

There are 2 best solutions below

1
On

Above log4j file looks ok,

please check that:

  1. BaseTestNGListener configured for this execution
  2. reportportal.properties file exist on the resources with all the relevant details.
1
On

If you are using logger-java-log4j of version 4.0.2 (the last one left for 4th version of RP) along with Log4j2 then please ensure:

  1. You are using configuration from the manual (packages attribute inside configuration node is essential): https://github.com/reportportal/logger-java-log4j#xml
  2. Your Log4j2 version is greater or equal to: 2.12.1

The same is for the 5th version of RP.