package biz.paluch.logging.gelf.wildfly; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import java.io.StringWriter; import java.util.Map; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; import org.jboss.logmanager.MDC; import org.jboss.logmanager.NDC; import org.jboss.logmanager.handlers.WriterHandler; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; import biz.paluch.logging.gelf.GelfTestSender; import biz.paluch.logging.gelf.JsonUtil; import biz.paluch.logging.gelf.LogMessageField; /** * @author Mark Paluch */ public class WildFlyGelfLogFormatterTests { public static final String LOG_MESSAGE = "foo bar test log message"; public static final String EXPECTED_LOG_MESSAGE = LOG_MESSAGE; private WriterHandler handler = new WriterHandler(); private StringWriter stringWriter = new StringWriter(); @BeforeEach public void before() throws Exception { GelfTestSender.getMessages().clear(); LogManager.getLogManager().reset(); MDC.remove("mdcField1"); NDC.clear(); handler.setWriter(stringWriter); } @Test public void testDefaults() throws Exception { handler.setFormatter(new WildFlyJsonFormatter()); Logger logger = Logger.getLogger(getClass().getName()); logger.addHandler(handler); NDC.push("ndc message"); logger.info(LOG_MESSAGE); NDC.clear(); Map<String, Object> message = getMessage(); assertThat(message.get("version")).isNull(); assertThat(message.get("full_message")).isEqualTo(EXPECTED_LOG_MESSAGE); assertThat(message.get("short_message")).isEqualTo(EXPECTED_LOG_MESSAGE); assertThat(message.get("NDC")).isEqualTo("ndc message"); assertThat(message.get("facility")).isEqualTo("logstash-gelf"); assertThat(message.get("LoggerName")).isEqualTo(getClass().getName()); assertThat(message.get("Thread")).isNotNull(); assertThat(message.get("timestamp")).isNotNull(); assertThat(message.get("MyTime")).isNotNull(); assertThat(message.get("level")).isEqualTo("6"); assertThat(message.get(LogMessageField.NamedLogField.SourceMethodName.name())).isEqualTo("testDefaults"); assertThat(message.get(LogMessageField.NamedLogField.SourceClassName.name())).isEqualTo(getClass().getName()); } @Test public void testEmptyMessage() throws Exception { handler.setFormatter(new WildFlyJsonFormatter()); Logger logger = Logger.getLogger(getClass().getName()); logger.addHandler(handler); logger.info(""); Map<String, Object> message = getMessage(); assertThat(message.get("full_message")).isNull(); assertThat(message.get("short_message")).isNull(); } @Test public void testSimpleWithMsgFormatSubstitution() throws Exception { handler.setFormatter(new WildFlyJsonFormatter()); Logger logger = Logger.getLogger(getClass().getName()); logger.addHandler(handler); String logMessage = "foo bar test log message {0}"; String expectedMessage = "foo bar test log message aaa"; logger.log(Level.INFO, logMessage, new String[] { "aaa" }); Map<String, Object> message = getMessage(); assertThat(message.get("full_message")).isEqualTo(expectedMessage); assertThat(message.get("short_message")).isEqualTo(expectedMessage); } @Test public void testSimpleWithStringFormatSubstitution() throws Exception { handler.setFormatter(new WildFlyJsonFormatter()); Logger logger = Logger.getLogger(getClass().getName()); logger.addHandler(handler); String logMessage = "foo bar test log message %s"; String expectedMessage = "foo bar test log message aaa"; logger.log(Level.INFO, logMessage, new String[] { "aaa" }); Map<String, Object> message = getMessage(); assertThat(message.get("full_message")).isEqualTo(expectedMessage); assertThat(message.get("short_message")).isEqualTo(expectedMessage); } @Test public void testUnknownField() throws Exception { assertThrows(IllegalArgumentException.class, new Executable() { @Override public void execute() throws Throwable { WildFlyJsonFormatter formatter = new WildFlyJsonFormatter(); formatter.setFields("dummy"); } }); } @Test public void testNotSupportedField() throws Exception { assertThrows(IllegalArgumentException.class, new Executable() { @Override public void execute() throws Throwable { WildFlyJsonFormatter formatter = new WildFlyJsonFormatter(); formatter.setFields("Marker"); } }); } @Test public void testFields() throws Exception { WildFlyJsonFormatter formatter = new WildFlyJsonFormatter(); formatter.setFields("Time,Severity,ThreadName,SourceSimpleClassName,NDC"); handler.setFormatter(formatter); Logger logger = Logger.getLogger(getClass().getName()); logger.addHandler(handler); logger.info(LOG_MESSAGE); Map<String, Object> message = getMessage(); assertThat(message.get("SourceSimpleClassName")).isNotNull(); assertThat(message.get("LoggerName")).isNull(); } @Test public void testLineBreak() throws Exception { WildFlyJsonFormatter formatter = new WildFlyJsonFormatter(); formatter.setLineBreak("XxX"); handler.setFormatter(formatter); Logger logger = Logger.getLogger(getClass().getName()); logger.addHandler(handler); logger.info(LOG_MESSAGE); logger.info(LOG_MESSAGE); assertThat(stringWriter.getBuffer().toString().contains("}XxX{")).isTrue(); } @Test public void testMdcFields() throws Exception { WildFlyJsonFormatter formatter = new WildFlyJsonFormatter(); formatter.setOriginHost("myhost"); formatter.setAdditionalFields("fieldName1=fieldValue1,fieldName2=fieldValue2"); formatter.setDynamicMdcFields(".*"); formatter.setIncludeFullMdc(true); handler.setFormatter(formatter); Logger logger = Logger.getLogger(getClass().getName()); logger.addHandler(handler); MDC.put("mdcField1", "a value"); logger.info(LOG_MESSAGE); Map<String, Object> message = getMessage(); assertThat(message.get("host")).isEqualTo("myhost"); assertThat(message.get("fieldName1")).isEqualTo("fieldValue1"); assertThat(message.get("fieldName2")).isEqualTo("fieldValue2"); assertThat(message.get("mdcField1")).isEqualTo("a value"); } @Test public void testException() throws Exception { WildFlyJsonFormatter formatter = new WildFlyJsonFormatter(); formatter.setOriginHost("myhost"); formatter.setExtractStackTrace("true"); handler.setFormatter(formatter); Logger logger = Logger.getLogger(getClass().getName()); logger.addHandler(handler); logger.log(Level.WARNING, LOG_MESSAGE, new Exception("boom!")); Map<String, Object> message = getMessage(); assertThat(message.get("StackTrace").toString()).contains("boom!"); } public Map<String, Object> getMessage() { return JsonUtil.parseToMap(stringWriter.getBuffer().toString()); } }