How to write SLF4J logs into file; i.e. How to customise Logback configuration in Katalon Studio

I have published a GitHub repository

I created this project in the hope that it can reply to an old question posted in the Katalon user forum at April 2019:


Problem to solve

In a Katalon Studio project, I created Test Cases/runMyApps:

import com.kazurayam.myapp.MyApp3

MyApp3 instance = new MyApp3()
instance.execute()

This Test Case calls a Groovy class.

package com.kazurayam.myapp

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.util.StatusPrinter;
import com.kazurayam.ks.LoggerContextConfigurator

public class MyApp3 {

    final static Logger logger = LoggerFactory.getLogger(MyApp3.class)

    public void execute() {
        logger.info("Entering MyApp3 application.");
        WebUI.comment("calling Foo")

        Foo foo = new Foo()
        foo.doIt()

        WebUI.comment("called Foo")
        logger.info("Exiting MyApp3 application");
    }
}

This calls another Groovy class:

package com.kazurayam.myapp

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A class that emits a lot of logs which are very long
 * so that the amount of characters emitted by this class
 * will overflow the buffer of Console window of Katalon Stduio
 */
public class Foo {

    final static Logger logger = LoggerFactory.getLogger(Foo.class)

    void doIt() {
        for (int i = 0; i < 1000; i++) {
            StringBuilder sb = new StringBuilder()
            for (int j = 0; j < 300; j++) {
                sb.append("Hello(" + i + "," + j + ") ")
            }
            logger.debug(sb.toString())
        }
    }
}

If you read the source of the Foo class, you would notice that it generates quite a lot of debug logs (1000 lines) using the org.slf4j.Logger. And each log will be very long (3.8 K characters actually). The size of log will be 1000 * 3.8K = 3.8 Mega characters.

I ran the Test Cases/runMyApp. I got the following result:

01 log lines disappeared

In the Console tab of Katalon Studio, I expected to see 1000 lines of SLF4J logs from the Foo class. But actually I saw only the last part. Obviously, my Foo class emitted too much logs so that the logs exceeded the buffer size of the Console window of Katalon Studio GUI.

I wanted to see the whole SLF4J logs from my application class. How can I achieve it? — I want to write the SLF4J logs into a text file.

Solution

Katalon Studio internally uses the SLF4J with Logback.

In the official Logback documentation, I found a sample code how to customize the Logback Logger while specifying configuration via XML file.

Using this technique, I should be able to customize the LoggingContext of Logback so that it writes the logs into a text file.

Description

I have developed a Groovy class com.kazurayam.ks.LoggerContextConfigurator

package com.kazurayam.ks

import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.util.StatusPrinter;

/**
 * https://yujiorama.github.io/unofficial-translations/logback-manual/03-configuration.html
 */
public class LoggerContextConfigurator {

    public static void configure() {
        configure("Include/config/logback-file.xml")
    }

    public static void configure(String xml) {
        // SLF4Jがlogbackを使うように設定されていると想定
        LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory()
        try {
            JoranConfigurator configurator = new JoranConfigurator();
            configurator.setContext(context)
            // デフォルトの設定を取り消したければcontext.reset()を呼び出す
            //context.reset()
            // context.reset()を呼ばなければデフォルトの設定を残し、その上に新しい設定要素を上書きする
            configurator.doConfigure(xml)
        } catch (JoranException je) {
            // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(context);
    }
}

This code is almost identical to the sample code of Logback documentation. It modifies the LoggerContext object which were constructed by Katalon Studio. It overwrites some properties of the LoggerContext as specified by the XML config file, which is as follows:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property name="LOG_ROOT" value="./build/logs" />
  <property name="LOG_FILE_NAME" value="myapp" />

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${LOG_ROOT}/${LOG_FILE_NAME}.log</file>
    <append>true</append>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-40.40logger{39} - %msg{}%n</pattern>
    </encoder>
  </appender>

  <!-- com.kms and com.kazurayam, etc -->
  <logger name="com" level="debug">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="STDERR"/>

    <appender-ref ref="FILE" />
  </logger>

</configuration>

This XML declares an Appender named FILE. And the FILE appender is applied to all classes of which fully-qualified-class-names starts with com at the log level of debug. For example, the following classes will be targeted:

  • com.kms.katalon.core.keyword.builtin.CommentKeyword

  • com.kazurayam.myapp.Foo

I included a file logback-console.xml which is the default Logback configuration used by Katalon Studio. If you read this, you would understand how the logging is configured as default in Katalon Studio.

How to create a project that logs into a file

You want to create a Katalon Studio on your PC. Let me call it the “test” project.

In the “test” project, you want to create Test Cases/runMyApp3. You want to copy the above source and paste it into your Test Case.

Also please create Keywords/myapp/MyApp3.groovy and Keywords/myapp/Foo.groovy. You want to copy the above source and paste it into your Groovy class.

Now we will need to do something new.

Please visit the Releases page of GitHub repository. You will find a link to a jar file named LoggerContextConfigurator-x.x.x.jar. This jar contains the compiled binary of the class com.kazurayam.ks.LoggerContextConfigurator. Please download the jar file and save it into the Drivers folder of your local Katalon Studio project. The Driver folder would like this:

02 Drivers

Please create a file Include/config/logback-file.xml. The content of the file should be exactly like the source. You should copy and paste it.

The final step; you want to create a Test Listener.

import com.kazurayam.ks.LoggerContextConfigurator
import com.kms.katalon.core.annotation.BeforeTestCase
import com.kms.katalon.core.annotation.BeforeTestSuite
import com.kms.katalon.core.context.TestCaseContext
import com.kms.katalon.core.context.TestSuiteContext

class ConfigLogger {

    /**
     * Executes before every test case starts.
     * @param testCaseContext related information of the executed test case.
     */
    @BeforeTestCase
    def beforeTestCase(TestCaseContext testCaseContext) {
        LoggerContextConfigurator.configure("Include/config/logback-file.xml")
    }

    /**
     * Executes before every test suite starts.
     * @param testSuiteContext: related information of the executed test suite.
     */
    @BeforeTestSuite
    def beforeTestSuite(TestSuiteContext testSuiteContext) {
        LoggerContextConfigurator.configure("Include/config/logback-file.xml")
    }
}

This Test Listener just calls the LoggerContextConfigurator.configure(String xmlPath) before any Test Cases and Test Suites are invoked. Effectively the SLF4J Logger is customized so that it writes logs into file.

Now I can run the Test Cases/runMyApp3. It will run for a few seconds. It will create a very large text file at build/logs/myapp.log, which will look something line this:

2023-05-04 12:05:58.223 INFO  com.kazurayam.myapp.MyApp3               - Entering MyApp3 application.
2023-05-04 12:05:58.360 INFO  c.k.k.c.keyword.builtin.CommentKeyword   - calling Foo
2023-05-04 12:05:58.421 DEBUG com.kazurayam.myapp.Foo                  - Hello(0,0) Hello(0,1) Hello(0,2) Hello(0,3) Hello(0,4) Hello(0,5) Hello(0,6) Hello(0,7) Hello(0,8) Hello(0,9) Hello(0,10) Hello(0,11) Hello(0,12) Hello(0,13) Hello(0,14) Hello(0,15) Hello(0,16) Hello(0,17) Hello(0,18) Hello(0,19) Hello(0,20) Hello(0,21) Hello(0,22) Hello(0,23) Hello(0,24) Hello(0,25) Hello(0,26) Hello(0,27) Hello(0,28) Hello(0,29) Hello(0,30) Hello(0,31) Hello(0,32) Hello(0,33) Hello(0,34) Hello(0,35) Hello(0,36) Hello(0,37) Hello(0,38) Hello(0,39) Hello(0,40) Hello(0,41) Hello(0,42) Hello(0,43) Hello(0,44) Hello(0,45) Hello(0,46) Hello(0,47) Hello(0,48) Hello(0,49) Hello(0,50) Hello(0,51) Hello(0,52) Hello(0,53) Hello(0,54) Hello(0,55) Hello(0,56) Hello(0,57) Hello(0,58) Hello(0,59) Hello(0,60) Hello(0,61) Hello(0,62) Hello(0,63) Hello(0,64) Hello(0,65) Hello(0,66) Hello(0,67) Hello(0,68) Hello(0,69) Hello(0,70) Hello(0,71) Hello(0,72) Hello(0,73) Hello(0,74) Hello(0,75) Hello(0,76) Hello(0,77) Hello(0,78) Hello(0,79) Hello(0,80) Hello(0,81) Hello(0,82) Hello(0,83) Hello(0,84) Hello(0,85) Hello(0,86) Hello(0,87) Hello(0,88) Hello(0,89) Hello(0,90) Hello(0,91) Hello(0,92) Hello(0,93) Hello(0,94) Hello(0,95) Hello(0,96) Hello(0,97) Hello(0,98) Hello(0,99) Hello(0,100) Hello(0,101) Hello(0,102) Hello(0,103) Hello(0,104) Hello(0,105) Hello(0,106) Hello(0,107) Hello(0,108) Hello(0,109) Hello(0,110) Hello(0,111) Hello(0,112) Hello(0,113) Hello(0,114) Hello(0,115) Hello(0,116) Hello(0,117) Hello(0,118) Hello(0,119) Hello(0,120) Hello(0,121) Hello(0,122) Hello(0,123) Hello(0,124) Hello(0,125) Hello(0,126) Hello(0,127) Hello(0,128) Hello(0,129) Hello(0,130) Hello(0,131) Hello(0,132) Hello(0,133) Hello(0,134) Hello(0,135) Hello(0,136) Hello(0,137) Hello(0,138) Hello(0,139) Hello(0,140) Hello(0,141) Hello(0,142) Hello(0,143) Hello(0,144) Hello(0,145) Hello(0,146) Hello(0,147) Hello(0,148) Hello(0,149) Hello(0,150) Hello(0,151) Hello(0,152) Hello(0,153) Hello(0,154) Hello(0,155) Hello(0,156) Hello(0,157) Hello(0,158) Hello(0,159) Hello(0,160) Hello(0,161) Hello(0,162) Hello(0,163) Hello(0,164) Hello(0,165) Hello(0,166) Hello(0,167) Hello(0,168) Hello(0,169) Hello(0,170) Hello(0,171) Hello(0,172) Hello(0,173) Hello(0,174) Hello(0,175) Hello(0,176) Hello(0,177) Hello(0,178) Hello(0,179) Hello(0,180) Hello(0,181) Hello(0,182) Hello(0,183) Hello(0,184) Hello(0,185) Hello(0,186) Hello(0,187) Hello(0,188) Hello(0,189) Hello(0,190) Hello(0,191) Hello(0,192) Hello(0,193) Hello(0,194) Hello(0,195) Hello(0,196) Hello(0,197) Hello(0,198) Hello(0,199) Hello(0,200) Hello(0,201) Hello(0,202) Hello(0,203) Hello(0,204) Hello(0,205) Hello(0,206) Hello(0,207) Hello(0,208) Hello(0,209) Hello(0,210) Hello(0,211) Hello(0,212) Hello(0,213) Hello(0,214) Hello(0,215) Hello(0,216) Hello(0,217) Hello(0,218) Hello(0,219) Hello(0,220) Hello(0,221) Hello(0,222) Hello(0,223) Hello(0,224) Hello(0,225) Hello(0,226) Hello(0,227) Hello(0,228) Hello(0,229) Hello(0,230) Hello(0,231) Hello(0,232) Hello(0,233) Hello(0,234) Hello(0,235) Hello(0,236) Hello(0,237) Hello(0,238) Hello(0,239) Hello(0,240) Hello(0,241) Hello(0,242) Hello(0,243) Hello(0,244) Hello(0,245) Hello(0,246) Hello(0,247) Hello(0,248) Hello(0,249) Hello(0,250) Hello(0,251) Hello(0,252) Hello(0,253) Hello(0,254) Hello(0,255) Hello(0,256) Hello(0,257) Hello(0,258) Hello(0,259) Hello(0,260) Hello(0,261) Hello(0,262) Hello(0,263) Hello(0,264) Hello(0,265) Hello(0,266) Hello(0,267) Hello(0,268) Hello(0,269) Hello(0,270) Hello(0,271) Hello(0,272) Hello(0,273) Hello(0,274) Hello(0,275) Hello(0,276) Hello(0,277) Hello(0,278) Hello(0,279) Hello(0,280) Hello(0,281) Hello(0,282) Hello(0,283) Hello(0,284) Hello(0,285) Hello(0,286) Hello(0,287) Hello(0,288) Hello(0,289) Hello(0,290) Hello(0,291) Hello(0,292) Hello(0,293) Hello(0,294) Hello(0,295) Hello(0,296) Hello(0,297) Hello(0,298) Hello(0,299)
2023-05-04 12:05:58.427 DEBUG com.kazurayam.myapp.Foo                  - Hello(1,0) Hello(1,1) Hello(1,2) Hello(1,3) Hello(1,4) Hello(1,5) Hello(1,6) Hello(1,7) Hello(1,8) Hello(1,9) Hello(1,10) Hello(1,11) Hello(1,12) Hello(1,13) Hello(1,14) Hello(1,15) Hello(1,16) Hello(1,17) Hello(1,18) Hello(1,19) Hello(1,20) Hello(1,21) Hello(1,22) Hello(1,23) Hello(1,24) Hello(1,25) Hello(1,26) Hello(1,27) Hello(1,28) Hello(1,29) Hello(1,30) Hello(1,31) Hello(1,32) Hello(1,33) Hello(1,34) Hello(1,35) Hello(1,36) Hello(1,37) Hello(1,38) Hello(1,39) Hello(1,40) Hello(1,41) Hello(1,42) Hello(1,43) Hello(1,44) Hello(1,45) Hello(1,46) Hello(1,47) Hello(1,48) Hello(1,49) Hello(1,50) Hello(1,51) Hello(1,52) Hello(1,53) Hello(1,54) Hello(1,55) Hello(1,56) Hello(1,57) Hello(1,58) Hello(1,59) Hello(1,60) Hello(1,61) Hello(1,62) Hello(1,63) Hello(1,64) Hello(1,65) Hello(1,66) Hello(1,67) Hello(1,68) Hello(1,69) Hello(1,70) Hello(1,71) Hello(1,72) Hello(1,73) Hello(1,74) Hello(1,75) Hello(1,76) Hello(1,77) Hello(1,78) Hello(1,79) Hello(1,80) Hello(1,81) Hello(1,82) Hello(1,83) Hello(1,84) Hello(1,85) Hello(1,86) Hello(1,87) Hello(1,88) Hello(1,89) Hello(1,90) Hello(1,91) Hello(1,92) Hello(1,93) Hello(1,94) Hello(1,95) Hello(1,96) Hello(1,97) Hello(1,98) Hello(1,99) Hello(1,100) Hello(1,101) Hello(1,102) Hello(1,103) Hello(1,104) Hello(1,105) Hello(1,106) Hello(1,107) Hello(1,108) Hello(1,109) Hello(1,110) Hello(1,111) Hello(1,112) Hello(1,113) Hello(1,114) Hello(1,115) Hello(1,116) Hello(1,117) Hello(1,118) Hello(1,119) Hello(1,120) Hello(1,121) Hello(1,122) Hello(1,123) Hello(1,124) Hello(1,125) Hello(1,126) Hello(1,127) Hello(1,128) Hello(1,129) Hello(1,130) Hello(1,131) Hello(1,132) Hello(1,133) Hello(1,134) Hello(1,135) Hello(1,136) Hello(1,137) Hello(1,138) Hello(1,139) Hello(1,140) Hello(1,141) Hello(1,142) Hello(1,143) Hello(1,144) Hello(1,145) Hello(1,146) Hello(1,147) Hello(1,148) Hello(1,149) Hello(1,150) Hello(1,151) Hello(1,152) Hello(1,153) Hello(1,154) Hello(1,155) Hello(1,156) Hello(1,157) Hello(1,158) Hello(1,159) Hello(1,160) Hello(1,161) Hello(1,162) Hello(1,163) Hello(1,164) Hello(1,165) Hello(1,166) Hello(1,167) Hello(1,168) Hello(1,169) Hello(1,170) Hello(1,171) Hello(1,172) Hello(1,173) Hello(1,174) Hello(1,175) Hello(1,176) Hello(1,177) Hello(1,178) Hello(1,179) Hello(1,180) Hello(1,181) Hello(1,182) Hello(1,183) Hello(1,184) Hello(1,185) Hello(1,186) Hello(1,187) Hello(1,188) Hello(1,189) Hello(1,190) Hello(1,191) Hello(1,192) Hello(1,193) Hello(1,194) Hello(1,195) Hello(1,196) Hello(1,197) Hello(1,198) Hello(1,199) Hello(1,200) Hello(1,201) Hello(1,202) Hello(1,203) Hello(1,204) Hello(1,205) Hello(1,206) Hello(1,207) Hello(1,208) Hello(1,209) Hello(1,210) Hello(1,211) Hello(1,212) Hello(1,213) Hello(1,214) Hello(1,215) Hello(1,216) Hello(1,217) Hello(1,218) Hello(1,219) Hello(1,220) Hello(1,221) Hello(1,222) Hello(1,223) Hello(1,224) Hello(1,225) Hello(1,226) Hello(1,227) Hello(1,228) Hello(1,229) Hello(1,230) Hello(1,231) Hello(1,232) Hello(1,233) Hello(1,234) Hello(1,235) Hello(1,236) Hello(1,237) Hello(1,238) Hello(1,239) Hello(1,240) Hello(1,241) Hello(1,242) Hello(1,243) Hello(1,244) Hello(1,245) Hello(1,246) Hello(1,247) Hello(1,248) Hello(1,249) Hello(1,250) Hello(1,251) Hello(1,252) Hello(1,253) Hello(1,254) Hello(1,255) Hello(1,256) Hello(1,257) Hello(1,258) Hello(1,259) Hello(1,260) Hello(1,261) Hello(1,262) Hello(1,263) Hello(1,264) Hello(1,265) Hello(1,266) Hello(1,267) Hello(1,268) Hello(1,269) Hello(1,270) Hello(1,271) Hello(1,272) Hello(1,273) Hello(1,274) Hello(1,275) Hello(1,276) Hello(1,277) Hello(1,278) Hello(1,279) Hello(1,280) Hello(1,281) Hello(1,282) Hello(1,283) Hello(1,284) Hello(1,285) Hello(1,286) Hello(1,287) Hello(1,288) Hello(1,289) Hello(1,290) Hello(1,291) Hello(1,292) Hello(1,293) Hello(1,294) Hello(1,295) Hello(1,296) Hello(1,297) Hello(1,298) Hello(1,299)
2023-05-04 12:05:58.431 DEBUG com.kazurayam.myapp.Foo                  - Hello(2,0) Hello(2,1) Hello(2,2) Hello(2,3) Hello(2,4) Hello(2,5) Hello(2,6) Hello(2,7) Hello(2,8) Hello(2,9) Hello(2,10) Hello(2,11) Hello(2,12) Hello(2,13) Hello(2,14) Hello(2,15) Hello(2,16) Hello(2,17) Hello(2,18) Hello(2,19) Hello(2,20) Hello(2,21) Hello(2,22) Hello(2,23) Hello(2,24) Hello(2,25) Hello(2,26) Hello(2,27) Hello(2,28) Hello(2,29) Hello(2,30) Hello(2,31) Hello(2,32) Hello(2,33) Hello(2,34) Hello(2,35) Hello(2,36) Hello(2,37) Hello(2,38) Hello(2,39) Hello(2,40) Hello(2,41) Hello(2,42) Hello(2,43) Hello(2,44) Hello(2,45) Hello(2,46) Hello(2,47) Hello(2,48) Hello(2,49) Hello(2,50) Hello(2,51) Hello(2,52) Hello(2,53) Hello(2,54) Hello(2,55) Hello(2,56) Hello(2,57) Hello(2,58) Hello(2,59) Hello(2,60) Hello(2,61) Hello(2,62) Hello(2,63) Hello(2,64) Hello(2,65) Hello(2,66) Hello(2,67) Hello(2,68) Hello(2,69) Hello(2,70) Hello(2,71) Hello(2,72) Hello(2,73) Hello(2,74) Hello(2,75) Hello(2,76) Hello(2,77) Hello(2,78) Hello(2,79) Hello(2,80) Hello(2,81) Hello(2,82) Hello(2,83) Hello(2,84) Hello(2,85) Hello(2,86) Hello(2,87) Hello(2,88) Hello(2,89) Hello(2,90) Hello(2,91) Hello(2,92) Hello(2,93) Hello(2,94) Hello(2,95) Hello(2,96) Hello(2,97) Hello(2,98) Hello(2,99) Hello(2,100) Hello(2,101) Hello(2,102) Hello(2,103) Hello(2,104) Hello(2,105) Hello(2,106) Hello(2,107) Hello(2,108) Hello(2,109) Hello(2,110) Hello(2,111) Hello(2,112) Hello(2,113) Hello(2,114) Hello(2,115) Hello(2,116) Hello(2,117) Hello(2,118) Hello(2,119) Hello(2,120) Hello(2,121) Hello(2,122) Hello(2,123) Hello(2,124) Hello(2,125) Hello(2,126) Hello(2,127) Hello(2,128) Hello(2,129) Hello(2,130) Hello(2,131) Hello(2,132) Hello(2,133) Hello(2,134) Hello(2,135) Hello(2,136) Hello(2,137) Hello(2,138) Hello(2,139) Hello(2,140) Hello(2,141) Hello(2,142) Hello(2,143) Hello(2,144) Hello(2,145) Hello(2,146) Hello(2,147) Hello(2,148) Hello(2,149) Hello(2,150) Hello(2,151) Hello(2,152) Hello(2,153) Hello(2,154) Hello(2,155) Hello(2,156) Hello(2,157) Hello(2,158) Hello(2,159) Hello(2,160) Hello(2,161) Hello(2,162) Hello(2,163) Hello(2,164) Hello(2,165) Hello(2,166) Hello(2,167) Hello(2,168) Hello(2,169) Hello(2,170) Hello(2,171) Hello(2,172) Hello(2,173) Hello(2,174) Hello(2,175) Hello(2,176) Hello(2,177) Hello(2,178) Hello(2,179) Hello(2,180) Hello(2,181) Hello(2,182) Hello(2,183) Hello(2,184) Hello(2,185) Hello(2,186) Hello(2,187) Hello(2,188) Hello(2,189) Hello(2,190) Hello(2,191) Hello(2,192) Hello(2,193) Hello(2,194) Hello(2,195) Hello(2,196) Hello(2,197) Hello(2,198) Hello(2,199) Hello(2,200) Hello(2,201) Hello(2,202) Hello(2,203) Hello(2,204) Hello(2,205) Hello(2,206) Hello(2,207) Hello(2,208) Hello(2,209) Hello(2,210) Hello(2,211) Hello(2,212) Hello(2,213) Hello(2,214) Hello(2,215) Hello(2,216) Hello(2,217) Hello(2,218) Hello(2,219) Hello(2,220) Hello(2,221) Hello(2,222) Hello(2,223) Hello(2,224) Hello(2,225) Hello(2,226) Hello(2,227) Hello(2,228) Hello(2,229) Hello(2,230) Hello(2,231) Hello(2,232) Hello(2,233) Hello(2,234) Hello(2,235) Hello(2,236) Hello(2,237) Hello(2,238) Hello(2,239) Hello(2,240) Hello(2,241) Hello(2,242) Hello(2,243) Hello(2,244) Hello(2,245) Hello(2,246) Hello(2,247) Hello(2,248) Hello(2,249) Hello(2,250) Hello(2,251) Hello(2,252) Hello(2,253) Hello(2,254) Hello(2,255) Hello(2,256) Hello(2,257) Hello(2,258) Hello(2,259) Hello(2,260) Hello(2,261) Hello(2,262) Hello(2,263) Hello(2,264) Hello(2,265) Hello(2,266) Hello(2,267) Hello(2,268) Hello(2,269) Hello(2,270) Hello(2,271) Hello(2,272) Hello(2,273) Hello(2,274) Hello(2,275) Hello(2,276) Hello(2,277) Hello(2,278) Hello(2,279) Hello(2,280) Hello(2,281) Hello(2,282) Hello(2,283) Hello(2,284) Hello(2,285) Hello(2,286) Hello(2,287) Hello(2,288) Hello(2,289) Hello(2,290) Hello(2,291) Hello(2,292) Hello(2,293) Hello(2,294) Hello(2,295) Hello(2,296) Hello(2,297) Hello(2,298) Hello(2,299)
...
2023-05-04 12:06:00.071 DEBUG com.kazurayam.myapp.Foo                  - Hello(999,0) Hello(999,1) Hello(999,2) Hello(999,3) Hello(999,4) Hello(999,5) Hello(999,6) Hello(999,7) Hello(999,8) Hello(999,9) Hello(999,10) Hello(999,11) Hello(999,12) Hello(999,13) Hello(999,14) Hello(999,15) Hello(999,16) Hello(999,17) Hello(999,18) Hello(999,19) Hello(999,20) Hello(999,21) Hello(999,22) Hello(999,23) Hello(999,24) Hello(999,25) Hello(999,26) Hello(999,27) Hello(999,28) Hello(999,29) Hello(999,30) Hello(999,31) Hello(999,32) Hello(999,33) Hello(999,34) Hello(999,35) Hello(999,36) Hello(999,37) Hello(999,38) Hello(999,39) Hello(999,40) Hello(999,41) Hello(999,42) Hello(999,43) Hello(999,44) Hello(999,45) Hello(999,46) Hello(999,47) Hello(999,48) Hello(999,49) Hello(999,50) Hello(999,51) Hello(999,52) Hello(999,53) Hello(999,54) Hello(999,55) Hello(999,56) Hello(999,57) Hello(999,58) Hello(999,59) Hello(999,60) Hello(999,61) Hello(999,62) Hello(999,63) Hello(999,64) Hello(999,65) Hello(999,66) Hello(999,67) Hello(999,68) Hello(999,69) Hello(999,70) Hello(999,71) Hello(999,72) Hello(999,73) Hello(999,74) Hello(999,75) Hello(999,76) Hello(999,77) Hello(999,78) Hello(999,79) Hello(999,80) Hello(999,81) Hello(999,82) Hello(999,83) Hello(999,84) Hello(999,85) Hello(999,86) Hello(999,87) Hello(999,88) Hello(999,89) Hello(999,90) Hello(999,91) Hello(999,92) Hello(999,93) Hello(999,94) Hello(999,95) Hello(999,96) Hello(999,97) Hello(999,98) Hello(999,99) Hello(999,100) Hello(999,101) Hello(999,102) Hello(999,103) Hello(999,104) Hello(999,105) Hello(999,106) Hello(999,107) Hello(999,108) Hello(999,109) Hello(999,110) Hello(999,111) Hello(999,112) Hello(999,113) Hello(999,114) Hello(999,115) Hello(999,116) Hello(999,117) Hello(999,118) Hello(999,119) Hello(999,120) Hello(999,121) Hello(999,122) Hello(999,123) Hello(999,124) Hello(999,125) Hello(999,126) Hello(999,127) Hello(999,128) Hello(999,129) Hello(999,130) Hello(999,131) Hello(999,132) Hello(999,133) Hello(999,134) Hello(999,135) Hello(999,136) Hello(999,137) Hello(999,138) Hello(999,139) Hello(999,140) Hello(999,141) Hello(999,142) Hello(999,143) Hello(999,144) Hello(999,145) Hello(999,146) Hello(999,147) Hello(999,148) Hello(999,149) Hello(999,150) Hello(999,151) Hello(999,152) Hello(999,153) Hello(999,154) Hello(999,155) Hello(999,156) Hello(999,157) Hello(999,158) Hello(999,159) Hello(999,160) Hello(999,161) Hello(999,162) Hello(999,163) Hello(999,164) Hello(999,165) Hello(999,166) Hello(999,167) Hello(999,168) Hello(999,169) Hello(999,170) Hello(999,171) Hello(999,172) Hello(999,173) Hello(999,174) Hello(999,175) Hello(999,176) Hello(999,177) Hello(999,178) Hello(999,179) Hello(999,180) Hello(999,181) Hello(999,182) Hello(999,183) Hello(999,184) Hello(999,185) Hello(999,186) Hello(999,187) Hello(999,188) Hello(999,189) Hello(999,190) Hello(999,191) Hello(999,192) Hello(999,193) Hello(999,194) Hello(999,195) Hello(999,196) Hello(999,197) Hello(999,198) Hello(999,199) Hello(999,200) Hello(999,201) Hello(999,202) Hello(999,203) Hello(999,204) Hello(999,205) Hello(999,206) Hello(999,207) Hello(999,208) Hello(999,209) Hello(999,210) Hello(999,211) Hello(999,212) Hello(999,213) Hello(999,214) Hello(999,215) Hello(999,216) Hello(999,217) Hello(999,218) Hello(999,219) Hello(999,220) Hello(999,221) Hello(999,222) Hello(999,223) Hello(999,224) Hello(999,225) Hello(999,226) Hello(999,227) Hello(999,228) Hello(999,229) Hello(999,230) Hello(999,231) Hello(999,232) Hello(999,233) Hello(999,234) Hello(999,235) Hello(999,236) Hello(999,237) Hello(999,238) Hello(999,239) Hello(999,240) Hello(999,241) Hello(999,242) Hello(999,243) Hello(999,244) Hello(999,245) Hello(999,246) Hello(999,247) Hello(999,248) Hello(999,249) Hello(999,250) Hello(999,251) Hello(999,252) Hello(999,253) Hello(999,254) Hello(999,255) Hello(999,256) Hello(999,257) Hello(999,258) Hello(999,259) Hello(999,260) Hello(999,261) Hello(999,262) Hello(999,263) Hello(999,264) Hello(999,265) Hello(999,266) Hello(999,267) Hello(999,268) Hello(999,269) Hello(999,270) Hello(999,271) Hello(999,272) Hello(999,273) Hello(999,274) Hello(999,275) Hello(999,276) Hello(999,277) Hello(999,278) Hello(999,279) Hello(999,280) Hello(999,281) Hello(999,282) Hello(999,283) Hello(999,284) Hello(999,285) Hello(999,286) Hello(999,287) Hello(999,288) Hello(999,289) Hello(999,290) Hello(999,291) Hello(999,292) Hello(999,293) Hello(999,294) Hello(999,295) Hello(999,296) Hello(999,297) Hello(999,298) Hello(999,299)
2023-05-04 12:06:00.078 INFO  c.k.k.c.keyword.builtin.CommentKeyword   - called Foo
2023-05-04 12:06:00.081 INFO  com.kazurayam.myapp.MyApp3               - Exiting MyApp3 application
2023-05-04 12:06:00.098 INFO  c.k.katalon.core.main.TestCaseExecutor   - END Test Cases/runMyApp3

This file contains full lines of logs emitted by the classes in a Test Case run. This proves that I could customize the Logback configuration in Katalon Studio and could write the SLF4J logs into a text file.

Further customization

Logback config file’s name and location

You can change the name and location of the Logback config file. See the Test Listener/ConfigLogger.groovy file. There you can find the following statement, which you can change as you want:

     LoggerContextConfigurator.configure("Include/config/logback-file.xml")

output log file’s name and location

You can also change the name and location of the output log file. See the logback-file.xml file. There you can find the following declarations, which you can change as you want:

<configuration>
  <property name="LOG_ROOT" value="./build/logs" />
  <property name="LOG_FILE_NAME" value="myapp" />
  ...

Definition of loggers

You can add/change/delete the <loggers> in the logback-file.xml. For example, it contains this:

<!-- com.kms and com.kazurayam, etc -->
  <logger name="com" level="debug">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="STDERR"/>

    <appender-ref ref="FILE" />
  </logger>

I can change this to:

<!-- com.kms.katalon -->
  <logger name="com.kms.katalon" level="debug">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="STDERR"/>

    <appender-ref ref="FILE" />
  </logger>

This change will make a significant difference in the resulting text file. Why? ---- you should be able to understand the change if you are trained enough for Logback.

What else?

Further more, you can change the Logback configuration more drastically. For example,

  1. you can change the message format by amending <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-40.40logger{39} - %msg{}%n</pattern>

  2. you can switch the Appender class to RollingFileAppender

You can do any customization as far as Logback allows.

3 Likes

Hi @kazurayam,

Thank you for your continued effort to produce such helpful tutorials! I will go ahead and put this topic into our #product-forums:tips-tricks category so that it would get better visibility. :+1:

Thanks for sharing!