Как расширить приложение gelf log4j2 (biz.paluch.logging), чтобы добавить собственный GelfSender

У меня есть приложение log4j2 gelf в проекте Spring Boot, настроенное в log4j2-spring.xml:

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

Библиотека gelf appender импортируется с помощью maven:

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

Библиотека предоставляет несколько отправителей GelfSender (biz.paluch.logging.gelf.intern.GelfSender), таких как GelfHTTPSender, GelfREDISSender и т. д. Как расширить добавление gelf, настроенное в log4j2-spring.xml, для использования пользовательского GelfSender.


person trf    schedule 05.06.2020    source источник


Ответы (1)


Тег приложения <gelf ...> в XML создает файл biz.paluch.logging.gelf.log4j.GelfLogAppender.

Класс GelfLogAppender использует GelfSenderFactory для создания используемого GeldSender. GelfSenderFactory может загружать GelfSenderProvider(s) через интерфейс поставщика услуг Java:

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

Чтобы добавить собственный GelfSender, вы создаете класс, расширяющий интерфейс GelfSenderProvider:

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);
    }
}

Где CustomGelfSender — это ваша реализация интерфейса GelfSender:

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 
    }
}

Затем CustomGelfSenderProvider добавляется в качестве службы интерфейса поставщика услуг Java путем добавления файла в src/main/resources/META-INF/services.

Имя файла должно быть полным именем класса интерфейса, реализуемого службой, поэтому в данном случае biz.paluch.logging.gelf.intern.GelfSenderProvider .

Содержимое этого файла представляет собой полное имя класса реализации GelfSenderProvider, поэтому в данном случае com.example.logging.CustomGelfSenderProvider.

person trf    schedule 06.06.2020