Мы мигрируем из 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);
}
}