Пружинная загрузка log4j2 не работает - PullRequest
0 голосов
/ 27 апреля 2019

Программная конфигурация для log4j2, за исключением slf4j, не обновляется даже при использовании org.apache.logging.log4j.core.config.Configuration.

Запуск загрузочного приложения Spring с приведенной ниже конфигурацией.

package org.mevenk.webservices;

.
import org.mevenk.webservices.logger.Logger;
import org.mevenk.webservices.logger.LoggerFactory;

@EnableAutoConfiguration
@SpringBootApplication
public class MeVenkWebServicesApplication {

private static final Logger LOG = 
LoggerFactory.getlogger(MeVenkWebServicesApplication.class);

public static void main(String[] args) {
    SpringApplication.run(MeVenkWebServicesApplication.class, args);

    }

}

public interface Logger {

    public void debug(final String message);

}


package org.mevenk.webservices.logger;

import org.apache.logging.log4j.core.config.LoggerConfig;

class LoggerDefinition {

    private LoggerConfig loggerConfig;

    LoggerDefinition(final String name, final LogLevel logLevel, final boolean additive) {
        this.loggerConfig = new LoggerConfig(name, logLevel.getLevel(), additive);
    }

}


package org.mevenk.webservices.logger;

import org.apache.logging.log4j.Level;

enum LogLevel {

    DEBUG {
        @Override
        Level getLevel() {
            return Level.DEBUG;
        }
    }

    abstract Level getLevel();

}


package org.mevenk.webservices.logger;

import org.apache.logging.log4j.LogManager;

final class MeVenkWebServicesLogger implements Logger {

    private final org.apache.logging.log4j.Logger logger;

    MeVenkWebServicesLogger(final Class<?> clazz) {
        logger = LogManager.getLogger(clazz);
        System.out.println(logger);
    }

    @Override
    public void debug(String message) {
        logger.debug(message);

    }

}

Конфигурация обрабатывается с помощью фабричного класса

package org.mevenk.webservices.logger;

import java.util.LinkedHashMap;
import java.util.LinkedHashSet;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;


public final class LoggerFactory {

    private static final LinkedHashMap<Class<?>, Logger> LOGGER_OBJECTS = new LinkedHashMap<Class<?>, Logger>();
    private static final LinkedHashSet<LoggerDefinition> LOGGER_DEFINITIONS = new LinkedHashSet<LoggerDefinition>();

    static {
        setLoggerConfiguration();
    }

    private static void setLoggerConfiguration() {

        updateLoggerlevelMap();
        addLogLvels();

    }

    private static void updateLoggerlevelMap() {

        LOGGER_DEFINITIONS.add(new LoggerDefinition("org.mevenk.webservices.controller", LogLevel.DEBUG, false));
        LOGGER_DEFINITIONS.add(new LoggerDefinition("org.mevenk.webservices.service", LogLevel.INFO, false));

    }

    private static void addLogLvels() {

        final LoggerContext loggerContext = (LoggerContext) LoggerContext.getContext(false);
        final Configuration config = loggerContext.getConfiguration();

        for (LoggerDefinition definition : LOGGER_DEFINITIONS) {
            LoggerConfig loggerConfig = definition.getLoggerConfig();
            config.addLogger(loggerConfig.getName(), loggerConfig);
            Level level = loggerConfig.getLevel();
            loggerConfig.setLevel(level);
        }

        loggerContext.updateLoggers();

    }

    public static Logger getlogger(Class<?> clazz) {

        return addOrReturnLogger(clazz);
    }

    private static Logger addOrReturnLogger(Class<?> clazz) {
        if (!LOGGER_OBJECTS.containsKey(clazz)) {
            LOGGER_OBJECTS.put(clazz, new MeVenkWebServicesLogger(clazz));
        }
        return LOGGER_OBJECTS.get(clazz);
    }

}

Эта конфигурация устанавливает *.controller пакет на DEBUG, но в конечном итоге он устанавливается на INFO.

При запуске этого приложения выводится нижняя консоль для Loggers.

org.mevenk.webservices.MeVenkWebServicesApplication:ERROR in 18b4aac2
org.mevenk.webservices.controller.RootController:INFO in 18b4aac2
org.mevenk.webservices.controller.samplerest.SampleRestCallsController:INFO in 18b4aac2
org.mevenk.webservices.service.impl.samplerest.SampleRestCallsServiceImpl:INFO in 18b4aac2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...