package de.huxhorn.lilith.sandbox; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.message.FormattedMessage; import org.apache.logging.log4j.message.LocalizedMessage; import org.apache.logging.log4j.message.MapMessage; import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.message.MessageFormatMessage; import org.apache.logging.log4j.message.ObjectArrayMessage; import org.apache.logging.log4j.message.ObjectMessage; import org.apache.logging.log4j.message.ParameterizedMessage; import org.apache.logging.log4j.message.SimpleMessage; import org.apache.logging.log4j.message.StringFormattedMessage; import org.apache.logging.log4j.message.StructuredDataId; import org.apache.logging.log4j.message.StructuredDataMessage; import org.apache.logging.log4j.message.ThreadDumpMessage; import org.apache.logging.log4j.util.MessageSupplier; import org.apache.logging.log4j.util.Supplier; public class Log4j2Sandbox { private static final Marker PRIVATE_FOOBAR_MARKER = new MarkerManager.Log4jMarker("detached-foobar"); private static final Marker PRIVATE_FOO_MARKER = new MarkerManager.Log4jMarker("detached-foo"); private static final Marker PRIVATE_BAR_MARKER = new MarkerManager.Log4jMarker("detached-bar"); static { PRIVATE_BAR_MARKER.addParents(PRIVATE_FOO_MARKER); PRIVATE_FOOBAR_MARKER.addParents(PRIVATE_FOO_MARKER, PRIVATE_BAR_MARKER); } private static final Marker GLOBAL_FOOBAR_MARKER = MarkerManager.getMarker("global-foobar"); private static final Marker GLOBAL_FOO_MARKER = MarkerManager.getMarker("global-foo"); private static final Marker GLOBAL_BAR_MARKER = MarkerManager.getMarker("global-bar"); static { GLOBAL_BAR_MARKER.addParents(GLOBAL_FOO_MARKER); GLOBAL_FOOBAR_MARKER.addParents(GLOBAL_FOO_MARKER, GLOBAL_BAR_MARKER); } private static class InnerClass { @SuppressWarnings({"ThrowableInstanceNeverThrown"}) static void execute() { final Logger logger = LogManager.getLogger(InnerClass.class); try { foobar(); } catch(RuntimeException ex) { RuntimeException newEx = new RuntimeException("Hello", ex); if(logger.isDebugEnabled()) logger.debug("Foo!",newEx); } try { foobar(); } catch(RuntimeException ex) { RuntimeException newEx = new RuntimeException("Multi\nline\nmessage", ex); if(logger.isDebugEnabled()) logger.debug("Foo!",newEx); } } static void foobar() { throw prepareException(); } } private static RuntimeException prepareException() { RuntimeException ex = new FooException("Hi."); ex.addSuppressed(new RuntimeException("Suppressed1")); ex.addSuppressed(new RuntimeException("Suppressed2")); return ex; } @SuppressWarnings({"ThrowableInstanceNeverThrown", "ThrowableResultOfMethodCallIgnored"}) public static void main(String args[]) { final Logger logger = LogManager.getLogger(Log4j2Sandbox.class); ThreadContext.push("NDC1"); ThreadContext.push("NDC2"); ThreadContext.push("NDC with spaces..."); ThreadContext.push("NDC with parameter {} and {}...", "foo", "bar"); ThreadContext.put("key1", "value1"); ThreadContext.put("key2", "value2"); logger.debug("########## Start ##########"); if(logger.isDebugEnabled()) logger.debug("Foobar!", new Throwable()); for(;;) { logger.debug("########## loop ##########"); InnerClass.execute(); logger.trace("Trace!"); logger.debug("Debug!"); logger.info("Info!"); logger.warn("Warn!"); logger.error("Error!"); logger.fatal("Fatal!"); logger.catching(Level.INFO, prepareException()); logger.catching(prepareException()); logger.debug(PRIVATE_FOO_MARKER, "private Foo Marker"); logger.debug(PRIVATE_BAR_MARKER, "private Bar Marker"); logger.debug(PRIVATE_FOOBAR_MARKER, "private Foobar Marker"); logger.debug(GLOBAL_FOO_MARKER, "global Foo Marker"); logger.debug(GLOBAL_BAR_MARKER, "global Bar Marker"); logger.debug(GLOBAL_FOOBAR_MARKER, "global Foobar Marker"); // see // https://issues.apache.org/jira/browse/LOG4J2-1226 // https://issues.apache.org/jira/browse/LOG4J2-1675 // https://issues.apache.org/jira/browse/LOG4J2-1676 logger.debug((Message)new SimpleMessage("simple message")); logger.debug(new FormattedMessage("curly-brackets FormattedMessage {} {}", new Object[]{"foo", "bar"})); logger.debug(new FormattedMessage("curly-brackets FormattedMessage {} {} with Throwable", new Object[]{"foo", "bar", prepareException()})); logger.debug(new FormattedMessage("curly-brackets FormattedMessage {} {} with Throwable {}", new Object[]{"foo", "bar", prepareException()})); logger.debug(new FormattedMessage("curly-brackets FormattedMessage {} {} with explicit Throwable", new Object[]{"foo", "bar"}, new FooException("foo exception"))); logger.debug(new FormattedMessage("curly-brackets FormattedMessage {} {}", new Object[]{new Foo(), "bar"})); logger.debug(new FormattedMessage("percent-s FormattedMessage %s %s", new Object[]{"foo", "bar"})); logger.debug(new FormattedMessage("percent-s FormattedMessage %s %s with Throwable", new Object[]{"foo", "bar", prepareException()})); logger.debug(new FormattedMessage("percent-s FormattedMessage %s %s with Throwable %s", new Object[]{"foo", "bar", prepareException()})); logger.debug(new LocalizedMessage("LocalizedMessage %s %s", new Object[]{"foo", "bar"})); logger.debug(new LocalizedMessage("LocalizedMessage %s %s with Throwable", new Object[]{"foo", "bar", prepareException()})); logger.debug(new LocalizedMessage("LocalizedMessage %s %s with Throwable %s", new Object[]{"foo", "bar", prepareException()})); logger.debug(new MessageFormatMessage("MessageFormatMessage {0}", "foo")); logger.debug(new MessageFormatMessage("MessageFormatMessage {0}", new Foo())); logger.debug(new MessageFormatMessage("MessageFormatMessage {0} with Throwable", new Foo(), prepareException())); logger.debug(new MessageFormatMessage("MessageFormatMessage {0} with Throwable {1}", new Foo(), prepareException())); logger.debug(new ParameterizedMessage("ParameterizedMessage {}", "foo")); logger.debug(new ParameterizedMessage("ParameterizedMessage {}", new Foo())); logger.debug(new ParameterizedMessage("ParameterizedMessage {} with Throwable", new Foo(), prepareException())); logger.debug(new ParameterizedMessage("ParameterizedMessage {} with Throwable {}", new Foo(), prepareException())); logger.debug(new StringFormattedMessage("StringFormattedMessage %s", "foo")); logger.debug(new StringFormattedMessage("StringFormattedMessage %s", new Foo())); logger.debug(new StringFormattedMessage("StringFormattedMessage %s with Throwable", new Foo(), prepareException())); logger.debug(new StringFormattedMessage("StringFormattedMessage %s with Throwable %s", new Foo(), prepareException())); // https://issues.apache.org/jira/browse/LOG4J2-1226?focusedCommentId=15645784&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-15645784 // "If you want to log a Throwable with a pre-existing Message object, you need to use one of the log(Message,Throwable) methods." logger.debug(new FormattedMessage("curly-brackets FormattedMessage {} {} with Throwable as expected", new Object[]{"foo", "bar"}), prepareException()); logger.debug(new FormattedMessage("percent-s FormattedMessage %s %s with Throwable as expected", new Object[]{"foo", "bar"}), prepareException()); logger.debug(new LocalizedMessage("LocalizedMessage %s %s with Throwable as expected", new Object[]{"foo", "bar"}), prepareException()); logger.debug(new MessageFormatMessage("MessageFormatMessage {0} with Throwable as expected", new Foo()), prepareException()); logger.debug(new ParameterizedMessage("ParameterizedMessage {} with Throwable as expected", new Foo()), prepareException()); logger.debug(new StringFormattedMessage("StringFormattedMessage %s with Throwable as expected", new Foo()), prepareException()); Map<String, String> map= new HashMap<>(); map.put("fooKey", "fooValue"); map.put("barKey", "barValue"); logger.debug(new MapMessage(map)); logger.debug(new ObjectArrayMessage("ObjectArrayMessage", "String")); logger.debug(new ObjectArrayMessage("ObjectArrayMessage", new Foo())); logger.debug(new ObjectMessage("ObjectMessage")); logger.debug(new ObjectMessage(new Foo())); logger.debug(new StructuredDataMessage(new StructuredDataId("dataIdName", 17, new String[]{"fooRequired"}, new String[]{"fooOptional"}), "StructuredDataMessage", "fooType", map)); logger.debug(new ThreadDumpMessage("threadDumpTitle")); logger.debug(new FooMessage()); deprecatedMessageSupplier(); supplier(); logger.debug("########## End ##########"); try { Thread.sleep(100); } catch(InterruptedException ex) { break; } } } @SuppressWarnings({"Convert2Lambda", "Anonymous2MethodRef", "deprecation"}) private static void deprecatedMessageSupplier() { final Logger logger = LogManager.getLogger(Log4j2Sandbox.class); MessageSupplier simpleMessageMessageSupplier=new MessageSupplier() { @Override public Message get() { return new SimpleMessage("simple message MessageSupplier"); } }; logger.debug(simpleMessageMessageSupplier); MessageSupplier formattedMessageMessageSupplier=new MessageSupplier() { @Override public Message get() { return new FormattedMessage("formatted message MessageSupplier {} {}", new Object[]{"foo", "bar"}, new FooException("foo exception")); } }; logger.debug(formattedMessageMessageSupplier); MessageSupplier fooMessageMessageSupplier=new MessageSupplier() { @Override public Message get() { return new FooMessage(); } }; logger.debug(fooMessageMessageSupplier); logger.debug(fooMessageMessageSupplier, prepareException()); } @SuppressWarnings({"Convert2Lambda", "Anonymous2MethodRef"}) private static void supplier() { final Logger logger = LogManager.getLogger(Log4j2Sandbox.class); Supplier<Message> simpleMessageSupplier=new Supplier<Message>() { @Override public Message get() { return new SimpleMessage("simple message Supplier<Message>"); } }; logger.debug(simpleMessageSupplier); Supplier<Message> formattedMessageSupplier=new Supplier<Message>() { @Override public Message get() { return new FormattedMessage("formatted message Supplier<Message> {} {}", new Object[]{"foo", "bar"}, new FooException("foo exception")); } }; logger.debug(formattedMessageSupplier); Supplier<Message> fooMessageSupplier=new Supplier<Message>() { @Override public Message get() { return new FooMessage(); } }; logger.debug(fooMessageSupplier); logger.debug(fooMessageSupplier, prepareException()); } private static class FooException extends RuntimeException { private static final long serialVersionUID = 8987753386120938525L; FooException(String msg) { super(msg); } } private static class FooMessage implements Message { private static final long serialVersionUID = -3246229797480524695L; @Override public String getFormattedMessage() { return "foo message"; } @Override public String getFormat() { return "foo message format"; } @Override public Object[] getParameters() { return new Object[]{"param1", "param2"}; } @Override public Throwable getThrowable() { return new RuntimeException(); } } private static class Foo implements Serializable { private static final long serialVersionUID = 7746306314408528044L; public String toString() { return "Foo object"; } } }