package biz.paluch.logging.gelf.log4j;
import static biz.paluch.logging.gelf.GelfMessageAssembler.FIELD_STACK_TRACE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
import org.apache.log4j.NDC;
import org.junit.jupiter.api.Test;
import biz.paluch.logging.gelf.GelfTestSender;
import biz.paluch.logging.gelf.GelfUtil;
import biz.paluch.logging.gelf.LogMessageField;
import biz.paluch.logging.gelf.intern.GelfMessage;
/**
* @author Mark Paluch
* @since 27.09.13 08:16
*/
public abstract class AbstractGelfLogAppenderTests {
public static final String LOG_MESSAGE = "foo bar test log message";
public static final String EXPECTED_LOG_MESSAGE = LOG_MESSAGE;
@Test
public void testSimpleInfo() throws Exception {
Logger logger = Logger.getLogger(getClass());
NDC.clear();
NDC.push("ndc message");
logger.info(LOG_MESSAGE);
NDC.clear();
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.getField("NDC")).isEqualTo("ndc message");
assertThat(gelfMessage.getField("MyTime")).isNotNull();
assertThat(gelfMessage.getLevel()).isEqualTo("6");
assertThat(gelfMessage.getMaximumMessageSize()).isEqualTo(8192);
assertThat(gelfMessage.getVersion()).isEqualTo(GelfMessage.GELF_VERSION_1_1);
// this is because of default-logstash-fields.properties
assertThat(gelfMessage.getAdditonalFields().get("MySeverity")).isEqualTo("INFO");
}
@Test
public void testLevels() throws Exception {
Logger logger = Logger.getLogger(getClass());
String expectedMessage = "foo bar test log message";
logger.trace(expectedMessage);
assertThat(GelfTestSender.getMessages()).isEmpty();
logger.debug(expectedMessage);
assertThat(GelfTestSender.getMessages().get(0).getLevel()).isEqualTo("7");
GelfTestSender.getMessages().clear();
logger.info(expectedMessage);
assertThat(GelfTestSender.getMessages().get(0).getLevel()).isEqualTo("6");
GelfTestSender.getMessages().clear();
logger.warn(expectedMessage);
assertThat(GelfTestSender.getMessages().get(0).getLevel()).isEqualTo("4");
GelfTestSender.getMessages().clear();
logger.error(expectedMessage);
assertThat(GelfTestSender.getMessages().get(0).getLevel()).isEqualTo("3");
GelfTestSender.getMessages().clear();
logger.fatal(expectedMessage);
assertThat(GelfTestSender.getMessages().get(0).getLevel()).isEqualTo("2");
GelfTestSender.getMessages().clear();
}
@Test
public void testException() throws Exception {
Logger logger = Logger.getLogger(getClass());
logger.info(LOG_MESSAGE, new Exception("this is an exception"));
assertThat(GelfTestSender.getMessages()).hasSize(1);
GelfMessage gelfMessage = GelfTestSender.getMessages().get(0);
assertThat(gelfMessage.getFullMessage()).isEqualTo(LOG_MESSAGE);
assertThat(gelfMessage.getField(LogMessageField.NamedLogField.SourceClassName.getFieldName()))
.isEqualTo(AbstractGelfLogAppenderTests.class.getName());
assertThat(gelfMessage.getField(LogMessageField.NamedLogField.SourceMethodName.getFieldName()))
.isEqualTo("testException");
assertThat(gelfMessage.getField(FIELD_STACK_TRACE)).contains("this is an exception");
assertThat(gelfMessage.getField(FIELD_STACK_TRACE)).contains("skipped");
assertThat(gelfMessage.getField(FIELD_STACK_TRACE)).contains("skipped");
}
@Test
public void testFields() throws Exception {
Logger logger = Logger.getLogger(getClass());
MDC.put("mdcField1", "a value");
MDC.remove(GelfUtil.MDC_REQUEST_START_MS);
logger.info(LOG_MESSAGE);
assertThat(GelfTestSender.getMessages()).hasSize(1);
GelfMessage gelfMessage = GelfTestSender.getMessages().get(0);
assertThat(gelfMessage.getField("fieldName1")).isEqualTo("fieldValue1");
assertThat(gelfMessage.getField("fieldName2")).isEqualTo("fieldValue2");
if (Log4jUtil.isLog4jMDCAvailable()) {
assertThat(gelfMessage.getField("mdcField1")).isEqualTo("a value");
assertThat(gelfMessage.getField("mdcField1")).isEqualTo("a value");
assertThat(gelfMessage.getField("mdcField2")).isNull();
assertThat(gelfMessage.getField(GelfUtil.MDC_REQUEST_DURATION)).isNull();
assertThat(gelfMessage.getField(GelfUtil.MDC_REQUEST_END)).isNull();
}
assertThat(gelfMessage.getField(LogMessageField.NamedLogField.SourceLineNumber.name())).isNotNull();
assertThat(gelfMessage.getField(LogMessageField.NamedLogField.SourceMethodName.name())).isEqualTo("testFields");
assertThat(gelfMessage.getField(LogMessageField.NamedLogField.SourceClassName.name()))
.isEqualTo(AbstractGelfLogAppenderTests.class.getName());
}
@Test
public void testProfiling() throws Exception {
assumeTrue(Log4jUtil.isLog4jMDCAvailable());
Logger logger = Logger.getLogger(getClass());
MDC.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(GelfUtil.MDC_REQUEST_DURATION)).isNotNull();
assertThat(gelfMessage.getField(GelfUtil.MDC_REQUEST_END)).isNotNull();
}
@Test
public void testLongProfiling() throws Exception {
assumeTrue(Log4jUtil.isLog4jMDCAvailable());
Logger logger = Logger.getLogger(getClass());
MDC.put(GelfUtil.MDC_REQUEST_START_MS, "" + (System.currentTimeMillis() - 2000));
logger.info(LOG_MESSAGE);
assertThat(GelfTestSender.getMessages()).hasSize(1);
GelfMessage gelfMessage = GelfTestSender.getMessages().get(0);
assertThat(gelfMessage.getField(GelfUtil.MDC_REQUEST_DURATION)).isNotNull();
assertThat(gelfMessage.getField(GelfUtil.MDC_REQUEST_END)).isNotNull();
}
@Test
public void testProfilingWrongStart() throws Exception {
assumeTrue(Log4jUtil.isLog4jMDCAvailable());
Logger logger = Logger.getLogger(getClass());
MDC.put(GelfUtil.MDC_REQUEST_START_MS, "");
logger.info(LOG_MESSAGE);
assertThat(GelfTestSender.getMessages()).hasSize(1);
GelfMessage gelfMessage = GelfTestSender.getMessages().get(0);
assertThat(gelfMessage.getField(GelfUtil.MDC_REQUEST_DURATION)).isNull();
assertThat(gelfMessage.getField(GelfUtil.MDC_REQUEST_END)).isNull();
}
@Test
public void testNullMessageAndExceptionFallback() throws Exception {
Logger logger = Logger.getLogger(getClass());
logger.info(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 = Logger.getLogger(getClass());
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 = Logger.getLogger(getClass());
logger.info("");
assertThat(GelfTestSender.getMessages()).isEmpty();
}
}