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:
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:
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,
-
you can change the message format by amending
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-40.40logger{39} - %msg{}%n</pattern>
-
you can switch the Appender class to RollingFileAppender
You can do any customization as far as Logback allows.