英文:
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:
<Gelf name="graylog" host="https://example.com/gelf" version="1.1">
<PatternLayout pattern="%logger{1.} - %msg%n"/>
<!--- additional configuration --->
</Gelf>
The gelf appender library is imported using maven:
<dependency>
<groupId>biz.paluch.logging</groupId>
<artifactId>logstash-gelf</artifactId>
<version>1.14.0</version>
</dependency>
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
<gelf ...>
XML标签在XML中创建一个 biz.paluch.logging.gelf.log4j.GelfLogAppender
。
GelfLogAppender
类使用 GelfSenderFactory
来创建要使用的 GeldSender
。GelfSenderFactory
能够通过Java Service Provider接口加载 GelfSenderProvider
(们):
ServiceLoader<GelfSenderProvider> 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 <gelf ...>
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<GelfSenderProvider> 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
.
专注分享java语言的经验与见解,让所有开发者获益!
评论