package org.graylog2.log;
import org.apache.log4j.*;
import org.apache.log4j.spi.ErrorHandler;
import org.apache.log4j.spi.LoggingEvent;
import org.graylog2.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.SocketException;
import java.net.UnknownHostException;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
/**
* @author Anton Yakimov
* @author Jochen Schalanda
*/
public class GelfAppenderTest {
private static final String CLASS_NAME = GelfAppenderTest.class.getCanonicalName();
private TestGelfSender gelfSender;
private GelfAppender gelfAppender;
private boolean rawExtended = false;
@Before
public void setUp() throws IOException {
gelfSender = new TestGelfSender("localhost");
gelfAppender = new GelfAppender() {
@Override
public GelfSender getGelfSender() {
return gelfSender;
}
@Override
public void append(LoggingEvent event) {
super.append(event);
}
@Override
public Object transformExtendedField(String field, Object object) {
if (rawExtended) {
return object;
}
else {
return super.transformExtendedField(field, object);
}
}
};
}
@After
public void tearDown() {
if (gelfAppender.isAddExtendedInformation()) {
NDC.clear();
}
}
@Test
public void ensureHostnameForMessage() {
LoggingEvent event = new LoggingEvent(CLASS_NAME, Category.getInstance(GelfAppenderTest.class), 123L, Level.INFO, "Das Auto",
new RuntimeException("Volkswagen"));
gelfAppender.append(event);
assertThat("Message hostname", gelfSender.getLastMessage().getHost(), notNullValue());
gelfAppender.setOriginHost("example.com");
gelfAppender.append(event);
assertThat(gelfSender.getLastMessage().getHost(), is("example.com"));
}
@Test
public void handleNullInAppend() {
LoggingEvent event = new LoggingEvent(CLASS_NAME, Category.getInstance(this.getClass()), 123L, Level.INFO, null, new RuntimeException("LOL"));
gelfAppender.append(event);
assertThat("Message short message", gelfSender.getLastMessage().getShortMessage(), notNullValue());
assertThat("Message full message", gelfSender.getLastMessage().getFullMessage(), notNullValue());
}
@Test
public void handleMDC() {
gelfAppender.setAddExtendedInformation(true);
LoggingEvent event = new LoggingEvent(CLASS_NAME, Category.getInstance(this.getClass()), 123L, Level.INFO, "", new RuntimeException("LOL"));
MDC.put("foo", "bar");
gelfAppender.append(event);
assertEquals("bar", gelfSender.getLastMessage().getAdditonalFields().get("foo"));
assertNull(gelfSender.getLastMessage().getAdditonalFields().get("non-existent"));
}
@Test
public void handleMDCTransform() {
gelfAppender.setAddExtendedInformation(true);
LoggingEvent event = new LoggingEvent(CLASS_NAME, Category.getInstance(this.getClass()), 123L, Level.INFO, "", new RuntimeException("LOL"));
MDC.put("foo", 200);
gelfAppender.append(event);
assertEquals("200", gelfSender.getLastMessage().getAdditonalFields().get("foo"));
assertNull(gelfSender.getLastMessage().getAdditonalFields().get("non-existent"));
rawExtended = true;
event = new LoggingEvent(CLASS_NAME, Category.getInstance(this.getClass()), 123L, Level.INFO, "", new RuntimeException("LOL"));
gelfAppender.append(event);
assertEquals(new Integer(200), gelfSender.getLastMessage().getAdditonalFields().get("foo"));
assertNull(gelfSender.getLastMessage().getAdditonalFields().get("non-existent"));
}
@Test
public void handleNDC() {
gelfAppender.setAddExtendedInformation(true);
LoggingEvent event = new LoggingEvent(CLASS_NAME, Category.getInstance(this.getClass()), 123L, Level.INFO, "", new RuntimeException("LOL"));
NDC.push("Foobar");
gelfAppender.append(event);
assertEquals("Foobar", gelfSender.getLastMessage().getAdditonalFields().get("loggerNdc"));
}
@Test
public void disableExtendedInformation() {
gelfAppender.setAddExtendedInformation(false);
LoggingEvent event = new LoggingEvent(CLASS_NAME, Category.getInstance(this.getClass()), 123L, Level.INFO, "", new RuntimeException("LOL"));
MDC.put("foo", "bar");
NDC.push("Foobar");
gelfAppender.append(event);
assertNull(gelfSender.getLastMessage().getAdditonalFields().get("loggerNdc"));
assertNull(gelfSender.getLastMessage().getAdditonalFields().get("foo"));
}
@Test
public void checkExtendedInformation() throws UnknownHostException, SocketException {
gelfAppender.setAddExtendedInformation(true);
LoggingEvent event = new LoggingEvent(CLASS_NAME, Category.getInstance(GelfAppenderTest.class), 123L, Level.INFO, "Das Auto", new RuntimeException("LOL"));
gelfAppender.append(event);
assertEquals(gelfSender.getLastMessage().getAdditonalFields().get("logger"), CLASS_NAME);
}
@Test
public void testTcpUdpUrls() {
GelfAppender testGelfAppender = new GelfAppender() {
@Override
protected GelfUDPSender getGelfUDPSender(String udpGraylogHost, int port) throws IOException {
return new MockGelfUDPSender(udpGraylogHost, port);
}
@Override
protected GelfTCPSender getGelfTCPSender(String tcpGraylogHost, int port) throws IOException {
return new MockGelfTCPSender(tcpGraylogHost, port);
}
};
TestingEH testingEH = new TestingEH();
testGelfAppender.setErrorHandler(testingEH);
testGelfAppender.setGraylogHost("tcp:www.github.com");
testGelfAppender.activateOptions();
assertThat("No errors when using tcp: url", testingEH.getErrorMessage(), is(not("Unknown Graylog2 hostname:tcp:www.github.com")));
testGelfAppender.setGraylogHost("udp:www.github.com");
testGelfAppender.activateOptions();
assertThat("No errors when using udp: url", testingEH.getErrorMessage(), is(not("Unknown Graylog2 hostname:udp:www.github.com")));
testGelfAppender.setGraylogHost("www.github.com");
testGelfAppender.activateOptions();
assertThat("No errors when using udp: url", testingEH.getErrorMessage(), is(not("Unknown Graylog2 hostname:www.github.com")));
}
private class TestGelfSender extends GelfUDPSender {
private GelfMessage lastMessage;
public TestGelfSender(String host) throws IOException {
super(host);
}
@Override
public GelfSenderResult sendMessage(GelfMessage message) {
this.lastMessage = message;
return GelfSenderResult.OK;
}
public GelfMessage getLastMessage() {
return lastMessage;
}
}
private class TestingEH implements ErrorHandler {
private String errorMessage = "";
public void setLogger(Logger logger) {
}
public void error(String s, Exception e, int i) {
errorMessage = s;
}
public void error(String s) {
errorMessage = s;
}
public void error(String s, Exception e, int i, LoggingEvent loggingEvent) {
errorMessage = s;
}
public void setAppender(Appender appender) {
}
public void setBackupAppender(Appender appender) {
}
public void activateOptions() {
}
public String getErrorMessage() {
return errorMessage;
}
}
private class MockGelfUDPSender extends GelfUDPSender {
private MockGelfUDPSender(String host, int port) throws IOException {
if (host.contains("udp:")) {
throw new UnknownHostException("udp: found in host");
}
}
}
private class MockGelfTCPSender extends GelfTCPSender {
private MockGelfTCPSender(String host, int port) throws IOException {
if (host.contains("tcp:")) {
throw new UnknownHostException("tcp: found in host");
}
}
}
}