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