0

I have a log4j2 gelf appender in a Spring Boot project configured in log4j2-spring.xml:

<Gelf name="graylog" host="https://example.com/gelf" version="1.1">
    <PatternLayout pattern="%logger{1.} - %msg%n"/>
    <!--- additional configuration --->
</Gelf>

The gelf appender library is imported using maven:

<dependency>
    <groupId>biz.paluch.logging</groupId>
    <artifactId>logstash-gelf</artifactId>
    <version>1.14.0</version>
</dependency>

The library providers a number of GelfSenders (biz.paluch.logging.gelf.intern.GelfSender) such as GelfHTTPSender, GelfREDISSender etc. How do I extend the gelf appender configured in log4j2-spring.xml to use a custom GelfSender.

trf
  • 1,279
  • 1
  • 13
  • 33

1 Answers1

0

The <gelf ...> appender tag in the XML creates a biz.paluch.logging.gelf.log4j.GelfLogAppender

The GelfLogAppender class uses a GelfSenderFactory to create the GeldSender to be used. The GelfSenderFactory is able to load GelfSenderProvider(s) through the Java Service Provider Interface:

ServiceLoader<GelfSenderProvider> gelfSenderProvider 
    = ServiceLoader.load(GelfSenderProvider.class);

To add custom GelfSender, you create a class that extends the GelfSenderProvider interface:

package com.example.logging;

public class CustomGelfSenderProvider implements GelfSenderProvider {

    @Override
    public boolean supports(String host) {
        // return true if this GelfSender is able to support sending to the given host
        return true;
    }

    @Override
    public GelfSender create(GelfSenderConfiguration configuration) throws IOException {
        String host = configuration.getHost();
        return new CustomGelfSender(host);
    }
}

Where the CustomGelfSender is your implemenation of the GelfSender interface:

package com.example.logging;

public class CustomGelfSender implements GelfSender {

    private final String host;

    public CustomGelfSender(String host) {
        this.host = host;
    }

    @Override
    public boolean sendMessage(GelfMessage message) {
        // Send gelf message
        return true;
    }

    @Override
    public void close() {
        // Anything to clean up on close 
    }
}

The CustomGelfSenderProvider is then added as Java Service Provider Interface service by adding a file to src/main/resources/META-INF/services.

The name of the file should be the fully qualified class name of the interface the service implements, so in this case biz.paluch.logging.gelf.intern.GelfSenderProvider .

The contents of this file is the fully qualified class name of the GelfSenderProvider implementation, so in this case com.example.logging.CustomGelfSenderProvider.

trf
  • 1,279
  • 1
  • 13
  • 33