All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.graylog2.GelfUDPSender Maven / Gradle / Ivy

Go to download

GELF implementation in Java and log4j appender without any dependencies.

The newest version!
package org.graylog2;

import java.io.IOException;
import java.net.*;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.DatagramChannel;

public class GelfUDPSender implements GelfSender {

	private InetAddress host;
	private int port;
	private DatagramChannel channel;

	private static final int MAX_RETRIES = 5;

    public GelfUDPSender() {
    }

    public GelfUDPSender(String host) throws IOException {
		this(host, DEFAULT_PORT);
	}

	public GelfUDPSender(String host, int port) throws IOException {
		this.host = InetAddress.getByName(host);
		this.port = port;
		setChannel(initiateChannel());
	}

	private DatagramChannel initiateChannel() throws IOException {
		DatagramChannel resultingChannel = DatagramChannel.open();
		resultingChannel.socket().bind(new InetSocketAddress(0));
		resultingChannel.connect(new InetSocketAddress(this.host, this.port));
		resultingChannel.configureBlocking(false);

		return resultingChannel;
	}

	public GelfSenderResult sendMessage(GelfMessage message) {
		if (!message.isValid()) return GelfSenderResult.MESSAGE_NOT_VALID;
		return sendDatagrams(message.toUDPBuffers());
	}

	private GelfSenderResult sendDatagrams(ByteBuffer[] bytesList) {

		int tries = 0;
		Exception lastException = null;
		do {

			try {

				if (!getChannel().isOpen()) {
					setChannel(initiateChannel());
				}

				for (ByteBuffer buffer : bytesList) {
					getChannel().write(buffer);
				}

				return GelfSenderResult.OK;
			} catch (IOException e) {
				tries++;
				lastException = e;
			}
		} while (tries <= MAX_RETRIES);

		return new GelfSenderResult(GelfSenderResult.ERROR_CODE, lastException);
	}

	public void close() {
		try {
			getChannel().close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

    public DatagramChannel getChannel() {
        return channel;
    }

    public void setChannel(DatagramChannel channel) {
        this.channel = channel;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy