如何扩展 log4j2 的 gelf appender(biz.paluch.logging),以添加自定义的 GelfSender。

huangapple 未分类评论48阅读模式
英文:

How to extend log4j2 gelf appender (biz.paluch.logging) to add a custom GelfSender

问题

我在一个Spring Boot项目中配置了一个log4j2 gelf appender,配置信息在log4j2-spring.xml文件中:

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

通过Maven引入了gelf appender库:

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

该库提供了多个GelfSenders(biz.paluch.logging.gelf.intern.GelfSender),如GelfHTTPSender、GelfREDISSender等。我该如何扩展log4j2-spring.xml中配置的gelf appender,以使用自定义的GelfSender。
英文:

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

&lt;Gelf name=&quot;graylog&quot; host=&quot;https://example.com/gelf&quot; version=&quot;1.1&quot;&gt;
    &lt;PatternLayout pattern=&quot;%logger{1.} - %msg%n&quot;/&gt;
    &lt;!--- additional configuration ---&gt;
&lt;/Gelf&gt;

The gelf appender library is imported using maven:

&lt;dependency&gt;
    &lt;groupId&gt;biz.paluch.logging&lt;/groupId&gt;
    &lt;artifactId&gt;logstash-gelf&lt;/artifactId&gt;
    &lt;version&gt;1.14.0&lt;/version&gt;
&lt;/dependency&gt;

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.

答案1

得分: 0

&lt;gelf ...&gt; XML标签在XML中创建一个 biz.paluch.logging.gelf.log4j.GelfLogAppender

GelfLogAppender 类使用 GelfSenderFactory 来创建要使用的 GeldSenderGelfSenderFactory 能够通过Java Service Provider接口加载 GelfSenderProvider(们):

ServiceLoader&lt;GelfSenderProvider&gt; gelfSenderProvider 
    = ServiceLoader.load(GelfSenderProvider.class);

要添加自定义的 GelfSender,您可以创建一个扩展了 GelfSenderProvider 接口的类:

package com.example.logging;

public class CustomGelfSenderProvider implements GelfSenderProvider {

    @Override
    public boolean supports(String host) {
        // 如果这个 GelfSender 能够支持发送到给定的主机,则返回 true
        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) {
        // 发送 GELF 消息
        return true;
    }

    @Override
    public void close() {
        // 在关闭时清理任何资源
    }
}

然后,将 CustomGelfSenderProvider 添加为Java Service Provider接口的服务,通过在 src/main/resources/META-INF/services 中添加一个文件。

该文件的名称应该是服务实现的接口的完全限定类名,因此在这种情况下为 biz.paluch.logging.gelf.intern.GelfSenderProvider

该文件的内容是 GelfSenderProvider 实现的完全限定类名,因此在这种情况下为 com.example.logging.CustomGelfSenderProvider

英文:

The &lt;gelf ...&gt; 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&lt;GelfSenderProvider&gt; 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.

huangapple
  • 本文由 发表于 2020年6月5日 21:17:17
  • 转载请务必保留本文链接:https://java.coder-hub.com/62216255.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定