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
.