I wanted to create custom loggers for different logging scenarios so developers can call them based on their needs. The enum class I have created is given here:
import ch.qos.logback.classic.Level;
import lombok.Getter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Getter
public enum LogManager {
CONSOLE("console", null, Level.DEBUG),
SERVER("server", "-S", Level.DEBUG),
CLIENT("client", "-C", Level.DEBUG),
IN("in", "-I", Level.DEBUG),
OUT("out", "-O", Level.DEBUG),
FILE("file", "-L", Level.DEBUG),
REQ("req", "-REQ", Level.DEBUG),
DB("db", "-DB", Level.DEBUG),
SSO("sso", null, Level.DEBUG),
MIX("mix", "-MIX", Level.DEBUG),
STAT("stat", null, Level.DEBUG);
private final String name;
private final String fileName;
private final Level thresholdLevel;
private final Logger logger;
LogManager(String name, String fileName, Level thresholdLevel) {
this.name = name;
this.fileName = fileName;
this.thresholdLevel = thresholdLevel;
this.logger = LoggerFactory.getLogger(name);
// // set threshold level for logger
// LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
// lc.getLogger(name).setLevel(thresholdLevel);
}
}
I am using SIFT in logback to generate different files. Whenever I call the loggers here:
@SpringBootApplication
public class AnalyzerFrameworkApplication {
public static void main(String[] args) {
SpringApplication.run(AnalyzerFrameworkApplication.class, args);
LogManager.CLIENT.getLogger().error("ERROR");
LogManager.CLIENT.getLogger().info("INFO");
LogManager.CLIENT.getLogger().warn("WARN");
LogManager.CLIENT.getLogger().debug("DEBUG");
LogManager.CLIENT.getLogger().trace("TRACE");
LogManager.CONSOLE.getLogger().error("ERROR");
LogManager.CONSOLE.getLogger().info("INFO");
LogManager.CONSOLE.getLogger().warn("WARN");
LogManager.CONSOLE.getLogger().debug("DEBUG");
LogManager.CONSOLE.getLogger().trace("TRACE");
LogManager.IN.getLogger().error("ERROR");
LogManager.IN.getLogger().info("INFO");
LogManager.IN.getLogger().warn("WARN");
LogManager.IN.getLogger().debug("DEBUG");
LogManager.IN.getLogger().trace("TRACE");
}
}
They seem to not create different files with SIFT. So I dug deeper and found this issue in the discriminator (code similar to [https://stackoverflow.com/a/18398028/10582056)
@Override
public String getDiscriminatingValue(ILoggingEvent iLoggingEvent) {
Optional<LogManager> result = Arrays.stream(LogManager.values())
.filter(logger -> logger.getName().equalsIgnoreCase(iLoggingEvent.getLoggerName()))
.findFirst();
System.out.println(iLoggingEvent.getLoggerName());
System.out.println(result.isPresent());
if (result.isPresent()) {
System.out.println(result.get().getFileName());
return result.get().getFileName();
}
else return "-all";
}
The iLoggingEvent.getLoggerName()
is printing com.theglobalmarketaccess.anzfwk.AnalyzerFrameworkApplication
instead of one of the names I assigned for the logger like console
or server
or client
etc. Why? I have explicitly given the names, but it still reads the class names.