0

我在 log4j2-spring.xml 中配置的 Spring Boot 项目中有一个 log4j2 gelf appender:

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

使用 maven 导入 gelf appender 库:

<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 等。如何扩展 log4j2-spring.xml 中配置的 gelf appender 以使用自定义 GelfSender。

4

1 回答 1

0

XML 中的<gelf ...>appender 标记创建 biz.paluch.logging.gelf.log4j.GelfLogAppender

GelfLogAppender 类使用 GelfSenderFactory 来创建要使用的 GeldSender。GelfSenderFactory 能够通过 Java 服务提供者接口加载 GelfSenderProvider(s):

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

然后通过将文件添加到src/main/resources/META-INF/services.

文件名应该是服务实现的接口的全限定类名,所以在本例中为biz.paluch.logging.gelf.intern.GelfSenderProvider.

该文件的内容是 GelfSenderProvider 实现的完全限定类名,因此在本例中为com.example.logging.CustomGelfSenderProvider.

于 2020-06-06T08:57:44.670 回答