package io.gitlab.jfronny.glaunch.util; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Core; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.appender.AbstractAppender; 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.PluginElement; import org.apache.logging.log4j.core.config.plugins.PluginFactory; import org.apache.logging.log4j.util.StringBuilderFormattable; import java.time.Instant; import java.util.LinkedHashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @Plugin(name = "MapAppender", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE) public class MapAppender extends AbstractAppender { public static final ConcurrentMap EVENT_MAP = new ConcurrentHashMap<>(); public static final Set LOG = new LinkedHashSet<>(); protected MapAppender(String name, Filter filter) { //super(name, filter, null); super(name, filter, null, false, null); } @PluginFactory public static MapAppender createAppender( @PluginAttribute("name") String name, @PluginElement("Filter") Filter filter) { return new MapAppender(name, filter); } @Override public void append(LogEvent event) { EVENT_MAP.put(Instant.now().toString(), event); StringBuilder msg = new StringBuilder(event.getLevel().name()) .append(" | ") .append(Instant.now().toString()) .append(" | [") .append(event.getThreadName()) .append("] ") .append(event.getSource().getClassName()) .append(" - "); if (event.getMessage() instanceof StringBuilderFormattable sbf) sbf.formatTo(msg); else msg.append(event.getMessage().getFormattedMessage()); LOG.add(msg.toString()); } }