Skip to content

Instantly share code, notes, and snippets.

@crevier
Created March 5, 2018 16:34
Show Gist options
  • Save crevier/a2fd46e1a39acb06da7a6e6e2eee48a4 to your computer and use it in GitHub Desktop.
Save crevier/a2fd46e1a39acb06da7a6e6e2eee48a4 to your computer and use it in GitHub Desktop.
Log4j2 InMemoryAppender for tests
package log.appender;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
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.core.layout.PatternLayout;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Plugin(name = "InMemoryAppender", category = "Core", elementType = "appender", printObject = true)
public class InMemoryAppender extends AbstractAppender {
public static final Map<String, List<LogEvent>> logEvents = new HashMap<>();
protected InMemoryAppender(String name, Filter filter, Layout<? extends Serializable> layout) {
this(name, filter, layout, true);
}
public InMemoryAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions) {
super(name, filter, layout, ignoreExceptions);
}
@Override
public void append(LogEvent logEvent) {
String loggerName = logEvent.getLoggerName();
if (!logEvents.containsKey(loggerName)) {
logEvents.put(loggerName, new ArrayList<LogEvent>());
}
logEvents.get(loggerName).add(logEvent);
}
@PluginFactory
public static InMemoryAppender createAppender(
@PluginAttribute("name") String name,
@PluginElement("Layout") Layout<? extends Serializable> layout,
@PluginElement("Filter") final Filter filter,
@PluginAttribute("otherAttribute") String otherAttribute) {
if (name == null) {
LOGGER.error("No name provided for MyCustomAppenderImpl");
return null;
}
if (layout == null) {
layout = PatternLayout.createDefaultLayout();
}
return new InMemoryAppender(name, filter, layout, true);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<InMemoryAppender name="testAppender"/>
</Appenders>
<Loggers>
<Logger name="app.logger" level="trace">
<AppenderRef ref="testAppender"/>
</Logger>
<Root level="off"/>
</Loggers>
</Configuration>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment