Java 如何使用log4j2编写自定义web服务附加器?

Java 如何使用log4j2编写自定义web服务附加器?,java,logging,log4j2,appender,Java,Logging,Log4j2,Appender,我曾尝试使用log4j2编写一个自定义appender。它工作正常,在控制台中打印日志。但是我想使用log4j2编写一个定制的webservice appender 这是我的自定义appender类 @Plugin(name = "MyCustomAppender", category = "Core", elementType = "appender", printObject = true) public class MyCustomAppender extends AbstractAppe

我曾尝试使用log4j2编写一个自定义appender。它工作正常,在控制台中打印日志。但是我想使用log4j2编写一个定制的webservice appender

这是我的自定义appender类

@Plugin(name = "MyCustomAppender", category = "Core", elementType = "appender", printObject = true)
public class MyCustomAppender extends AbstractAppender {

    protected MyCustomAppender(String name, Filter filter,
            Layout<? extends Serializable> layout, String filename) {
        super(name, filter, layout);

        // TODO Auto-generated constructor stub
    }

    @PluginFactory
    public static MyCustomAppender createAppender(@PluginAttribute("name") String name,
            @PluginAttribute("fileName") final String fileName,
            @PluginElement("Layout") Layout<? extends Serializable> layout,
            @PluginElement("Filters") Filter filter) {



                return new MyCustomAppender(name, filter, layout,fileName);        
            }


    @Override
    public void append(LogEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("inside appender: " +arg0);

    }

}
@插件(name=“MyCustomAppender”,category=“Core”,elementType=“appender”,printObject=true)
公共类MyCustomAppender扩展了AbstractAppender{
受保护的MyCustomAppender(字符串名称、筛选器、,

布局据我所知,您的思路是正确的。您已经成功地创建了一个自定义appender,对其进行了配置,并确认它正在工作(登录到控制台)

下一步是:

  • 追加中(LogEvent)
    方法,将此信息发送到外部服务。
    LogEvent
    对象实现
    java.io.Serializable
    ,因此序列化日志事件可能是将此信息转换为字节的最简单方法。详细信息取决于您选择的外部服务的API
  • 在您的配置中,您可能希望区分各种类型的日志事件(您提到审计、事务和异常)。我建议您查看Log4j2。这提供了一种干净的方法来标记特定日志事件,以便在下游以不同方式处理它们。另一种方法是为这些类型配置单独的记录器,但这会很快变得混乱

Thnaks给你一个很好的答案。我有一个小问题,如何在log4j2.xml中配置服务url。如果你有任何示例plz共享。Thnak you添加一个参数
@PluginAttribute(“serviceURL”)怎么样将serviceURL
字符串连接到您的
createAppender
工厂方法。然后使用
进行配置。例如,控制台appender是在控制台中打印日志,而文件appender存储在文件目标中,我需要将日志存储到一个服务中。谢谢。我不清楚您的问题。要在og4j2.xml以便您的自定义附加程序知道要使用什么服务url,您需要添加一个参数
@PluginAttribute(“serviceURL”)字符串serviceURL
到您的
createAppender
工厂方法,以允许您配置
。此服务url的使用方式取决于您服务的API。这回答了您第一条评论中的问题。我不理解您的第二条评论。您想确切了解什么?
<?xml version="1.0" encoding="UTF-8"?>
<!-- status = level of INTERNAL Log4j events that should be logged to the console, used to debug log4j itself -->
<Configuration status="warn" packages="com.msr.appender">

    <Appenders>
        <MyCustomAppender name="myapp"  >
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </MyCustomAppender>

    </Appenders>
    <Loggers>
    <Root level="all" additivity="false">
    <AppenderRef ref="myapp"/>
    </Root>
  </Loggers>
</Configuration>