1

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.

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
ahrooran
  • 931
  • 1
  • 10
  • 25

0 Answers0