java - 如何扩展 log4j2 gelf 附加程序 (biz.paluch.logging) 以添加自定义 GelfSender

标签 java spring-boot gelf

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

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

使用maven导入gelfappender库:

<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 附加程序以使用自定义 GelfSender。

最佳答案

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

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

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

要添加自定义 GelfSender,您需要创建一个扩展 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);
    }
}

其中 CustomGelfSender 是 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 
    }
}

然后,通过将文件添加到 src/main/resources/META-INF/services,将 CustomGelfSenderProvider 添加为 Java 服务提供者接口(interface)服务。 .

文件名应该是服务实现的接口(interface)的完全限定类名,因此在本例中 biz.paluch.logging.gelf.intern.GelfSenderProvider

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

关于java - 如何扩展 log4j2 gelf 附加程序 (biz.paluch.logging) 以添加自定义 GelfSender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62216255/

相关文章:

java - 如何解析css(stylesheet)注释(annotations)?

java - 如何仅对行和固定数量的列进行 for 循环?

spring - 如何通过 GELF 将 spring boot 访问日志发送到远程服务器?

java - block 级同步

java - JLIST 的 setSelectedValue 方法出错

maven - Spring Boot 排除属性文件并在执行时将其提供给 jar

java - CAS-SSO 和 Spring Security (Spring Boot) 中的无限重定向登录循环

java - Spring boot @ComponentScan 与 @Import

java - 将日志发送到 Graylog 并以 Gelf 格式发送