I am running some scripts in parallel (using Gradle's maxParallelForks to run multiple threads) and using Logback for the logging.
I want that each script should print their log message in the respective files which are created by their name and the messages should not get intermingled between different log files. For sequential execution things are fine but problem arises for parallel execution.
Tried to put my code in synchronized block, explored Mapped Diagnostic Context (MDC) of Logback but did not help. Is there a way to attach my Logger to FileAppender or any other way to achieve this?
I am setting the logback configuration through code which looks some like below -
clazz - is the .class input form the calling script like PerformAction.class
static Logger init(String clazz) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
FileAppender rfAppender = new FileAppender();
rfAppender.setContext(loggerContext);
rfAppender.setFile(OUTPUT_LOCATION + "/" + clazz+"_"+ formatted + ".log");
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
encoder.setPattern("%d{HH:mm:ss.SSS} %-5level %logger - %msg%n");
encoder.start();
rfAppender.setEncoder(encoder);
rfAppender.start();
PatternLayoutEncoder logEncoder = new PatternLayoutEncoder()
logEncoder.setContext(loggerContext)
logEncoder.setPattern('%d{HH:mm:ss.SSS} %-5level %logger - %msg%n')
logEncoder.start()
ConsoleAppender logConsoleAppender = new ConsoleAppender()
logConsoleAppender.setContext(loggerContext)
logConsoleAppender.setName('console')
logConsoleAppender.setEncoder(logEncoder)
logConsoleAppender.start()
rootLogger.addAppender(rfAppender)
rootLogger.additive = false
return (Logger) LoggerFactory.getLogger(clazz)
}