In the recent versions of SAP Commerce (at least version 6.0+), all of the logger classes are NOT shown in HAC Logging Configuration and when we try to manually set the Log Level from HAC, SAP Commerce does not pick it up. To fix this issue, we need to write some code which will enable us to see all of the logger classes in Logging Configuration of HAC.

In SAP Commerce, it calls LoggerContext.getConfiguration().getLoggers().values() to get the current logger classes. This will ONLY give the logger classes that are explicitly configured through configuration. Following is the way to show all the logger classes by default:

Create the bean:

<bean class="com.mySite.core.util.MySiteHACLoggerScanner"/>

Define the class for the bean we just created:

import de.hybris.platform.util.logging.log4j2.HybrisLoggerContext;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.annotation.PostConstruct;
import org.apache.logging.log4j.Level;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.AppenderRef;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;

public class MySiteHACLoggerScanner {
    private static final Logger LOG = LogManager.getLogger();

    private Filter filter;
    private Level level = Level.INFO;
    private String appenderRef = "CONSOLE";
    private HybrisLoggerContext hybrisLoggerContext;
    private Configuration loggerConfiguration;

    public MySiteHACLoggerScanner() {
        hybrisLoggerContext = (HybrisLoggerContext) LogManager.getContext(false);
        loggerConfiguration = hybrisLoggerContext.getConfiguration();
        final LoggerConfig rootLogger = loggerConfiguration.getRootLogger();

        if (rootLogger != null) {
            if (rootLogger.getLevel() != null) {
                level = rootLogger.getLevel();
            }
            filter = rootLogger.getFilter();
        }
    }

    @PostConstruct
    public void process() {
        LOG.info("Adding active Loggers to the Hybris Logger Context...");
        processLog4J2Loggers(loggerConfiguration);
        LOG.info("Refreshing the Hybirs Logger Context...");
        hybrisLoggerContext.updateLoggers();
        LOG.info("Done!");
    }


    private void processLog4J2Loggers(final Configuration loggerConfiguration) {

        final LoggerContext logContext = (LoggerContext) LogManager.getContext(false);

        Collection<org.apache.logging.log4j.core.Logger> loggers = logContext.getLoggers();
        for (org.apache.logging.log4j.core.Logger logger : loggers) {
            if (logger.getLevel() != null) {
                setLogger(loggerConfiguration, logger.getName(), Level.getLevel(logger.getLevel().toString()));
            } else {
                setLogger(loggerConfiguration, logger.getName(), Level.getLevel(level.toString()));
            }
        }
    }


    private void setLogger(final Configuration loggerConfiguration, final String logClass, final Level logLevel) {
        final LoggerConfig loggerConfig = loggerConfiguration.getLoggers().get(logClass);
        List<AppenderRef> appenderRefs;

        if (loggerConfig != null) {
            appenderRefs = loggerConfig.getAppenderRefs();
        } else {
            appenderRefs = new ArrayList<>();
            appenderRefs.add(AppenderRef.createAppenderRef(appenderRef, level, filter));
        }

        final LoggerConfig createdLoggerConfig = LoggerConfig.createLogger(
                true,
                logLevel,
                logClass,
                "true",
                appenderRefs == null ? null : appenderRefs.toArray(new AppenderRef[appenderRefs.size()]),
                null,
                loggerConfiguration,
                filter
        );

        loggerConfiguration.addLogger(logClass, createdLoggerConfig);
    }
}

To know more about this issue, view the following answer from Experts: https://experts.hybris.com/questions/58660/hac-logging-configuration-in-60-and-above.html

Categories: Hybris

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *