Setup logback configuration to create separate folder by timestamp and separate log file for each test case within the folder

Viewed 174

I am trying to setup logback configuration to create separate folder for each test run and separate log file for each test case within the folder.

To achieve something like:

TestRun1 (16.04.2021T12:00) having two test cases

../target/logs/16042021_1200/testcase1
../target/logs/16042021_1200/testcase2

TestRun2 (16.04.2021T13:00) having two test cases

../target/logs/16042021_1200/testcase1
../target/logs/16042021_1200/testcase2
../target/logs/16042021_1300/testcase1
../target/logs/16042021_1300/testcase2

I am using gradle, junit5, logback:1.2.3

For now I have created SiftingAppender, to have separate log file for each test case.

logback.xml

<configuration>
<property name="LOG_HOME" value="build/logs/" />

<appender name="SIFTER" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator>
        <key>testName</key>
        <defaultValue>ALL</defaultValue>
    </discriminator>
    <sift>
        <appender name="FILE-${testName}" class="ch.qos.logback.core.FileAppender">
            <file>${LOG_HOME}/log_${testName}.log</file>
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    </sift>
</appender>

<root level="debug">
    <appender-ref ref="SIFTER"/>
</root>

jUnit test class:

@ExtendWith(LogWatcher.class)
public class JunitTest1 {

private static final Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(JunitTest1.class);

@Test
public void test1() {
    logger.info("Start test case1: info");
}

@Test
public void test2() {
    logger.info("Start test case2: info");
}
}

LogWatcher.class:

public class LogWatcher implements BeforeEachCallback {

@Override
public void beforeEach(ExtensionContext context) {
    String testCaseFullName =
            String.format("%s.%s", context.getTestClass().get().getName(),
                    context.getTestMethod().get().getName());
    MDC.put("testName", testCaseFullName);
}
}

So now I am able to write logs to one directory per test case, but I have an issue with creating folder per test execution, I planned to do that by timestamp. Does someone have an idea how to achieve it?

Note1: I tried to use RollingFileAppender but then I can not send the testname to lobback configuration.

Note2: I tried to use timestamp property in configuration and use it as variable in SiftingAppender but it also didn't work.

0 Answers
Related