Как вызвать метод сразу после каждого входа в log4j2 - PullRequest
0 голосов
/ 24 сентября 2018

Мы мигрируем из Log41.x в Log4j2.x.У нас была некоторая пользовательская регистрация в log4j1, где мы помещали некоторые аргументы журнала в ThreadLocal для некоторых журналов и те аргументы, которые выбирались нашим регистратором и отправлялись аппендеру.приложение также было пользовательским приложением, которое форматирует сообщение журнала в формат Json.После каждого журнала эти аргументы удаляются из локального потока.

То же самое, чего я хочу достичь в log4j2 для поддержки нашей старой системы ведения журналов.

Я попытался в log4j2, создав пользовательскийКласс LoggerConfig путем переопределения метода log, там я очищаю аргументы из локального потока.

Чтобы включить настраиваемый подключаемый модуль конфигурации Logger, я устанавливаю системное свойство {log4j.plugin.packages} для моего пакета класса customLoggerConfig.Но новая конфигурация логгера не выбирается конфигурацией log4j2.

import java.util.Arrays;
import java.util.List;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.async.AsyncLoggerContext;
import org.apache.logging.log4j.core.async.AsyncLoggerContextSelector;
import org.apache.logging.log4j.core.config.AppenderRef;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
import org.apache.logging.log4j.message.Message;


@Plugin(name = "customLogger", category = "Core", printObject = true)
public class CustomLoggerConfig extends LoggerConfig
{

public CustomLoggerConfig(final String name, final List<AppenderRef> appenders, final Filter filter,
        final Level level, final boolean additive, final Property[] properties, final Configuration config, final boolean includeLocation)
{
    super(name, appenders, filter, level, additive, null, config, includeLocation);
}

@Override
public void log(final String loggerName, final String fqcn, final Marker marker, final Level level,
        final Message data, final Throwable t)
{
    super.log(loggerName, fqcn, marker, level, data, t);
    clearLogArg();
}

@Override
public void log(final LogEvent event)
{
    super.log(event);
    clearLogArg();
}

public void clearLogArg()
{
    LogArg.clear();
}

@PluginFactory
public static LoggerConfig createLogger(@PluginAttribute(value = "additivity", defaultBoolean = true) final boolean additivity,
        @PluginAttribute("level") final Level level,
        @Required(message = "Loggers cannot be configured without a name") @PluginAttribute("name") final String loggerName,
        @PluginAttribute("includeLocation") final String includeLocation,
        @PluginElement("AppenderRef") final AppenderRef[] refs,
        @PluginElement("Properties") final Property[] properties,
        @PluginConfiguration final Configuration config,
        @PluginElement("Filter") final Filter filter
    ) {
        return new CustomLoggerConfig(loggerName, Arrays.asList(refs), filter, level, additivity, properties, config,
            includeLocation(includeLocation, config));
}

protected static boolean includeLocation(final String includeLocationConfigValue, final Configuration configuration)
{
    if (includeLocationConfigValue == null)
    {
        LoggerContext context = null;
        if (configuration != null)
        {
            context = configuration.getLoggerContext();
        }
        if (context != null)
        {
            return !(context instanceof AsyncLoggerContext);
        }
        else
        {
            return !AsyncLoggerContextSelector.isSelected();
        }
    }
    return Boolean.parseBoolean(includeLocationConfigValue);
}
}
...