Log4jConfigurator.java

package com.reallifedeveloper.common.infrastructure.jmx;

import java.util.List;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedOperationParameter;
import org.springframework.jmx.export.annotation.ManagedOperationParameters;
import org.springframework.jmx.export.annotation.ManagedResource;

import com.reallifedeveloper.common.domain.ErrorHandling;

/**
 * An implementation of the JMX {@link LogConfiguratorMXBean} interface using Log4j.
 *
 * @author RealLifeDeveloper
 */
@ManagedResource(description = "Log4j Configuration")
public class Log4jConfigurator implements LogConfiguratorMXBean {

    @Override
    @ManagedAttribute(description = "The available loggers")
    public List<String> getLoggers() {
        return LoggerContext.getContext().getConfiguration().getLoggers().entrySet().stream()
                .map(entry -> entry.getKey() + " = " + entry.getValue().getLevel()).toList();
        // return LoggerContext.getContext().getLoggers().stream().map(logger -> logger.getName() + "=" + logger.getLevel()).toList();

        // List<String> list = new ArrayList<String>();
        // @SuppressWarnings("rawtypes")
        // Enumeration loggers = LogManager.getCurrentLoggers();
        // while (loggers.hasMoreElements()) {
        // Logger logger = (Logger) loggers.nextElement();

        // if (logger.getLevel() != null) {
        // list.add(logger.getName() + " = " + logger.getLevel().toString());
        // }
        // }
        // return list;
    }

    @Override
    @ManagedOperation(description = "Gives the log level for a logger")
    @ManagedOperationParameters({ @ManagedOperationParameter(name = "logger", description = "The name of the logger") })
    public String getLogLevel(String loggerName) {
        return getLogger(loggerName).getLevel().name();

        // String levelName = "unavailable";

        // if (isNotBlank(loggerName)) {
        // Logger logger = Logger.getLogger(loggerName);

        // if (logger != null) {
        // Level level = logger.getLevel();
        // if (level != null) {
        // levelName = level.toString();
        // }
        // }
        // }
        // return levelName;
    }

    /**
     * {@inheritDoc}
     * <p>
     * If {@code level} cannot be parsed as a log level, the level is assumed to be {@code DEBUG}.
     */
    @Override
    @ManagedOperation(description = "Sets the log level for a logger")
    @ManagedOperationParameters({ @ManagedOperationParameter(name = "logger", description = "The name of the logger"),
            @ManagedOperationParameter(name = "level", description = "The new log level") })
    public void setLogLevel(String loggerName, String level) {
        if (isNotBlank(loggerName) && isNotBlank(level)) {
            getLogger(loggerName).setLevel(Level.getLevel(level));
        }

        // if (isNotBlank(loggerName) && isNotBlank(level)) {
        // Logger logger = Logger.getLogger(loggerName);

        // if (logger != null) {
        // logger.setLevel(Level.toLevel(level.toUpperCase(Locale.ROOT)));
        // }
        // }
    }

    private static Logger getLogger(String loggerName) {
        ErrorHandling.checkNull("loggerName must not be null", loggerName);
        return LoggerContext.getContext().getLogger(loggerName);
    }

    private static boolean isNotBlank(String s) {
        return s != null && !s.isBlank();
    }
}