package biz.paluch.logging.gelf.log4j2; import static org.assertj.core.api.Assertions.assertThat; import java.util.List; import java.util.Map; import java.util.concurrent.TimeoutException; 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.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import com.google.code.tempusfugit.temporal.Condition; import com.google.code.tempusfugit.temporal.Duration; import com.google.code.tempusfugit.temporal.Timeout; import com.google.code.tempusfugit.temporal.WaitFor; import biz.paluch.logging.RuntimeContainer; import biz.paluch.logging.gelf.GelfTestSender; import biz.paluch.logging.gelf.intern.GelfMessage; import biz.paluch.logging.gelf.netty.NettyLocalServer; import io.netty.channel.socket.nio.NioServerSocketChannel; /** * @author Mark Paluch */ public class GelfLogAppenderAsyncNettyTcpIntegrationTests { public static final String LOG_MESSAGE = "foo bar test log message"; public static final String EXPECTED_LOG_MESSAGE = LOG_MESSAGE; private static LoggerContext loggerContext; private static NettyLocalServer server = new NettyLocalServer(NioServerSocketChannel.class); @BeforeAll public static void setupClass() throws Exception { System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "log4j2/log4j2-async-netty-tcp.xml"); loggerContext = (LoggerContext) LogManager.getContext(false); loggerContext.reconfigure(); server.run(); } @AfterAll public static void afterClass() throws Exception { System.clearProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY); loggerContext.reconfigure(); server.close(); } @BeforeEach public void before() throws Exception { GelfTestSender.getMessages().clear(); ThreadContext.clearAll(); server.clear(); } @Test public void testWithLocation() throws Exception { Logger logger = loggerContext.getLogger("async.location"); logger.info(LOG_MESSAGE); waitForGelf(); List jsonValues = server.getJsonValues(); assertThat(jsonValues).hasSize(1); Map<String, Object> jsonValue = (Map<String, Object>) jsonValues.get(0); assertThat(jsonValue.get(GelfMessage.FIELD_HOST)).isEqualTo(RuntimeContainer.FQDN_HOSTNAME); assertThat(jsonValue.get("_server.simple")).isEqualTo(RuntimeContainer.HOSTNAME); assertThat(jsonValue.get("_server.fqdn")).isEqualTo(RuntimeContainer.FQDN_HOSTNAME); assertThat(jsonValue.get("_server")).isEqualTo(RuntimeContainer.FQDN_HOSTNAME); assertThat(jsonValue.get("_server.addr")).isEqualTo(RuntimeContainer.ADDRESS); assertThat(jsonValue.get("_className")).isEqualTo(getClass().getName()); assertThat(jsonValue.get("_simpleClassName")).isEqualTo(getClass().getSimpleName()); assertThat(jsonValue.get(GelfMessage.FIELD_FULL_MESSAGE)).isEqualTo(EXPECTED_LOG_MESSAGE); assertThat(jsonValue.get(GelfMessage.FIELD_SHORT_MESSAGE)).isEqualTo(EXPECTED_LOG_MESSAGE); assertThat(jsonValue.get("_level")).isEqualTo("INFO"); assertThat(jsonValue.get(GelfMessage.FIELD_LEVEL)).isEqualTo("6"); assertThat(jsonValue.get(GelfMessage.FIELD_FACILITY)).isEqualTo("logstash-gelf"); assertThat(jsonValue.get("_fieldName1")).isEqualTo("fieldValue1"); assertThat(jsonValue.get("_fieldName2")).isEqualTo("fieldValue2"); } @Test public void testWithoutLocation() throws Exception { Logger logger = loggerContext.getLogger("async.nolocation"); logger.info(LOG_MESSAGE); waitForGelf(); List jsonValues = server.getJsonValues(); assertThat(jsonValues).hasSize(1); Map<String, Object> jsonValue = (Map<String, Object>) jsonValues.get(0); assertThat(jsonValue.get(GelfMessage.FIELD_HOST)).isEqualTo(RuntimeContainer.FQDN_HOSTNAME); assertThat(jsonValue.get("_server.simple")).isEqualTo(RuntimeContainer.HOSTNAME); assertThat(jsonValue.get("_server.fqdn")).isEqualTo(RuntimeContainer.FQDN_HOSTNAME); assertThat(jsonValue.get("_server")).isEqualTo(RuntimeContainer.FQDN_HOSTNAME); assertThat(jsonValue.get("_server.addr")).isEqualTo(RuntimeContainer.ADDRESS); assertThat(jsonValue.get("_className")).isEqualTo("?"); assertThat(jsonValue.get("_simpleClassName")).isEqualTo("?"); assertThat(jsonValue.get(GelfMessage.FIELD_FULL_MESSAGE)).isEqualTo(EXPECTED_LOG_MESSAGE); assertThat(jsonValue.get(GelfMessage.FIELD_SHORT_MESSAGE)).isEqualTo(EXPECTED_LOG_MESSAGE); assertThat(jsonValue.get("_level")).isEqualTo("INFO"); assertThat(jsonValue.get(GelfMessage.FIELD_LEVEL)).isEqualTo("6"); assertThat(jsonValue.get(GelfMessage.FIELD_FACILITY)).isEqualTo("logstash-gelf"); assertThat(jsonValue.get("_fieldName1")).isEqualTo("fieldValue1"); assertThat(jsonValue.get("_fieldName2")).isEqualTo("fieldValue2"); } private void waitForGelf() throws InterruptedException, TimeoutException { WaitFor.waitOrTimeout(new Condition() { @Override public boolean isSatisfied() { return !server.getJsonValues().isEmpty(); } }, Timeout.timeout(Duration.seconds(2))); } }