【问题标题】:How to extend log4j2 gelf appender (biz.paluch.logging) to add a custom GelfSender如何扩展 log4j2 gelf appender (biz.paluch.logging) 以添加自定义 GelfSender
【发布时间】:2020-06-05 13:17:17
【问题描述】:

我在 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>

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

【问题讨论】:

    标签: java spring-boot gelf


    【解决方案1】:

    XML 中的&lt;gelf ...&gt; 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,将 CustomGelfSenderProvider 添加为 Java 服务提供者接口服务。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-20
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多