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

de.siegmar.logbackgelf.AbstractGelfAppender Maven / Gradle / Ivy

/*
 * Logback GELF - zero dependencies Logback GELF appender library.
 * Copyright (C) 2016 Oliver Siegmar
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

package de.siegmar.logbackgelf;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.UnsynchronizedAppenderBase;

public abstract class AbstractGelfAppender extends UnsynchronizedAppenderBase {

    private static final int DEFAULT_GELF_PORT = 12201;

    /**
     * IP or hostname of graylog server.
     */
    private String graylogHost;

    /**
     * Port of graylog server. Default: 12201.
     */
    private int graylogPort = DEFAULT_GELF_PORT;

    private GelfLayout layout;

    public String getGraylogHost() {
        return graylogHost;
    }

    public void setGraylogHost(final String graylogHost) {
        this.graylogHost = graylogHost;
    }

    public int getGraylogPort() {
        return graylogPort;
    }

    public void setGraylogPort(final int graylogPort) {
        this.graylogPort = graylogPort;
    }

    public GelfLayout getLayout() {
        return layout;
    }

    public void setLayout(final GelfLayout layout) {
        this.layout = layout;
    }

    @SuppressWarnings("checkstyle:illegalcatch")
    @Override
    public final void start() {
        if (graylogHost == null) {
            addError("No graylogHost configured");
            return;
        }

        if (layout == null) {
            layout = new GelfLayout();
            layout.setContext(getContext());
            layout.start();
        }

        if (layout.isAppendNewline()) {
            addError("Newline separator must not be enabled in layout");
            return;
        }

        try {
            startAppender();

            super.start();
        } catch (final Exception e) {
            addError("Couldn't start appender", e);
        }
    }

    protected void startAppender() throws IOException {
    }

    @SuppressWarnings("checkstyle:illegalcatch")
    @Override
    protected void append(final ILoggingEvent event) {
        final String message = layout.doLayout(event);
        final byte[] binMessage = message.getBytes(StandardCharsets.UTF_8);

        try {
            appendMessage(binMessage);
        } catch (final Exception e) {
            // Could be IOException or some kind of RuntimeException
            addError("Error sending GELF message", e);
        }
    }

    protected abstract void appendMessage(byte[] messageToSend) throws IOException;

    @Override
    public void stop() {
        super.stop();
        try {
            close();
        } catch (final IOException e) {
            addError("Couldn't close appender", e);
        }
    }

    protected abstract void close() throws IOException;

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy