package biz.paluch.logging.gelf.log4j2; import static org.assertj.core.api.Assertions.assertThat; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.ConfigurationFactory; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import biz.paluch.logging.RuntimeContainer; import biz.paluch.logging.gelf.GelfTestSender; import biz.paluch.logging.gelf.GelfUtil; import biz.paluch.logging.gelf.intern.GelfMessage; /** * @author Mark Paluch */ public class GelfLogAppenderTests { public static final String LOG_MESSAGE = "foo bar test log message"; public static final String EXPECTED_LOG_MESSAGE = LOG_MESSAGE; public static final String CONFIG_XML = "log4j2/log4j2.xml"; private static LoggerContext loggerContext; protected static void reconfigure(String configXml) { System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY, configXml); loggerContext = (LoggerContext) LogManager.getContext(false); loggerContext.reconfigure(); } @AfterAll public static void afterClass() throws Exception { System.clearProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY); loggerContext.reconfigure(); } @BeforeEach public void before() throws Exception { reconfigure(CONFIG_XML); GelfTestSender.getMessages().clear(); ThreadContext.clearAll(); } @Test public void testSimpleDebug() throws Exception { Logger logger = loggerContext.getLogger(getClass().getName()); assertThat(GelfTestSender.getMessages()).isEmpty(); logger.debug(LOG_MESSAGE); assertThat(GelfTestSender.getMessages()).isEmpty(); } @Test public void testSimpleInfo() throws Exception { Logger logger = loggerContext.getLogger(getClass().getName()); logger.info(LOG_MESSAGE); assertThat(GelfTestSender.getMessages()).hasSize(1); GelfMessage gelfMessage = GelfTestSender.getMessages().get(0); assertThat(gelfMessage.getFullMessage()).isEqualTo(EXPECTED_LOG_MESSAGE); assertThat(gelfMessage.getShortMessage()).isEqualTo(EXPECTED_LOG_MESSAGE); assertThat(gelfMessage.getVersion()).isEqualTo(GelfMessage.GELF_VERSION_1_1); assertThat(gelfMessage.getLevel()).isEqualTo("6"); assertThat(gelfMessage.getMaximumMessageSize()).isEqualTo(8192); assertThat(gelfMessage.getField("server")).isEqualTo(RuntimeContainer.FQDN_HOSTNAME); assertThat(gelfMessage.getField("server.simple")).isEqualTo(RuntimeContainer.HOSTNAME); assertThat(gelfMessage.getField("server.fqdn")).isEqualTo(RuntimeContainer.FQDN_HOSTNAME); assertThat(gelfMessage.getField("server.addr")).isEqualTo(RuntimeContainer.ADDRESS); assertThat(gelfMessage.getField("simpleClassName")).isEqualTo(GelfLogAppenderTests.class.getSimpleName()); } @Test public void testFqdnHost() throws Exception { reconfigure("log4j2/log4j2-origin-host-fqdn.xml"); Logger logger = loggerContext.getLogger(getClass().getName()); logger.info(LOG_MESSAGE); assertThat(GelfTestSender.getMessages()).hasSize(1); GelfMessage gelfMessage = GelfTestSender.getMessages().get(0); assertThat(gelfMessage.getHost()).isEqualTo(RuntimeContainer.FQDN_HOSTNAME); } @Test public void testSimpleHost() throws Exception { reconfigure("log4j2/log4j2-origin-host-simple.xml"); Logger logger = loggerContext.getLogger(getClass().getName()); logger.info(LOG_MESSAGE); assertThat(GelfTestSender.getMessages()).hasSize(1); GelfMessage gelfMessage = GelfTestSender.getMessages().get(0); assertThat(gelfMessage.getHost()).isEqualTo(RuntimeContainer.HOSTNAME); } @Test public void testCustomHost() throws Exception { reconfigure("log4j2/log4j2-origin-host-custom.xml"); Logger logger = loggerContext.getLogger(getClass().getName()); logger.info(LOG_MESSAGE); assertThat(GelfTestSender.getMessages()).hasSize(1); GelfMessage gelfMessage = GelfTestSender.getMessages().get(0); assertThat(gelfMessage.getHost()).isEqualTo("my.custom.host"); } @Test public void testEmptyFacility() throws Exception { reconfigure("log4j2/log4j2-empty-facility.xml"); Logger logger = loggerContext.getLogger(getClass().getName()); logger.info(LOG_MESSAGE); assertThat(GelfTestSender.getMessages()).hasSize(1); GelfMessage gelfMessage = GelfTestSender.getMessages().get(0); assertThat(gelfMessage.getFacility()).isEqualTo(""); } @Test public void testSimpleWarn() throws Exception { Logger logger = loggerContext.getLogger(getClass().getName()); logger.warn(LOG_MESSAGE); GelfMessage gelfMessage = GelfTestSender.getMessages().get(0); assertThat(gelfMessage.getLevel()).isEqualTo("4"); } @Test public void testSimpleError() throws Exception { Logger logger = loggerContext.getLogger(getClass().getName()); logger.error(LOG_MESSAGE); GelfMessage gelfMessage = GelfTestSender.getMessages().get(0); assertThat(gelfMessage.getLevel()).isEqualTo("3"); } @Test public void testSimpleFatal() throws Exception { Logger logger = loggerContext.getLogger(getClass().getName()); logger.fatal(LOG_MESSAGE); GelfMessage gelfMessage = GelfTestSender.getMessages().get(0); assertThat(gelfMessage.getLevel()).isEqualTo("2"); } @Test public void testMDC() throws Exception { Logger logger = loggerContext.getLogger(getClass().getName()); ThreadContext.put("mdcField1", "my mdc value"); ThreadContext.put(GelfUtil.MDC_REQUEST_START_MS, "" + System.currentTimeMillis()); logger.info(LOG_MESSAGE); assertThat(GelfTestSender.getMessages()).hasSize(1); GelfMessage gelfMessage = GelfTestSender.getMessages().get(0); assertThat(gelfMessage.getField("mdcField1")).isEqualTo("my mdc value"); assertThat(gelfMessage.getField(GelfUtil.MDC_REQUEST_DURATION)).isNotNull(); assertThat(gelfMessage.getField(GelfUtil.MDC_REQUEST_END)).isNotNull(); } @Test public void testFactory() throws Exception { GelfLogAppender result = GelfLogAppender.createAppender(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, false); assertThat(result).isNull(); result = GelfLogAppender.createAppender(null, "name", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, true); assertThat(result).isNull(); result = GelfLogAppender.createAppender(null, "name", null, null, null, null, "host", null, null, null, null, null, null, null, null, null, null, null, false); assertThat(result).isNotNull(); result = GelfLogAppender.createAppender(null, "name", null, null, null, null, "host", null, null, null, null, null, null, "facility", null, null, null, null, false); assertThat(result).isNotNull(); } @Test public void testNullMessageAndExceptionFallback() throws Exception { Logger logger = loggerContext.getLogger(getClass().getName()); logger.info((String) null, new IllegalStateException()); assertThat(GelfTestSender.getMessages()).hasSize(1); GelfMessage gelfMessage = GelfTestSender.getMessages().get(0); assertThat(gelfMessage.getFullMessage()).isEqualTo("java.lang.IllegalStateException"); assertThat(gelfMessage.getShortMessage()).isEqualTo("java.lang.IllegalStateException"); } @Test public void testEmptyMessageAndExceptionFallback() throws Exception { Logger logger = loggerContext.getLogger(getClass().getName()); logger.info("", new IllegalStateException("Help!")); assertThat(GelfTestSender.getMessages()).hasSize(1); GelfMessage gelfMessage = GelfTestSender.getMessages().get(0); assertThat(gelfMessage.getFullMessage()).isEqualTo("java.lang.IllegalStateException: Help!"); assertThat(gelfMessage.getShortMessage()).isEqualTo("java.lang.IllegalStateException: Help!"); } @Test public void testEmptyMessage() throws Exception { Logger logger = loggerContext.getLogger(getClass().getName()); logger.info(""); assertThat(GelfTestSender.getMessages()).isEmpty(); } }