通过扩展AppenderSkeleton编写自己的appender?

时间:2013-10-18 13:12:47

标签: java logging log4j java-ee-6

我正在使用log4j AsyncAppender。我编写了自己的appender来自定义记录器,如下所示。

public class MyAppender extends AppenderSkeleton {

    @Override
    public void close() {

    }


    @Override
    public boolean requiresLayout() {
        return false;
    }


    @Override
    protected void append(LoggingEvent event) {

    //Here am doing some logic which will connect database and fetch some records.
        // This process might take few seconds  

    }

}

我的log4j配置:

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">

    <!-- Appenders -->

    <appender name="stdout" class="com.sample.MyAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %p [%c] - %m%n"/>
        </layout>
    </appender>


    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
        <param name="BufferSize" value="500"/>
        <appender-ref ref="stdout"/>
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="ASYNC" />
    </root>

</log4j:configuration>

现在一切正常。我MyAppender我将触发Select查询并从表中获取一些详细信息,并使用java mail API发送这些详细信息。当我使用AsyncAppender时,它不会阻止父线程,并且使用单独的线程异步执行MyAppender逻辑。我的问题是,如果父线程在MyAppender逻辑完成之前完成其执行,那么是否存在保证即使父线程完成执行,MyAppender中的逻辑也会完成?

我的应用程序将部署在Tomcat上

谢谢!

1 个答案:

答案 0 :(得分:1)

这很好,AsyncAppender有自己的线程来处理这种情况。在生成消息的线程完成之前,您的appender不必完成。一旦你的appender收到消息,它就完全在另一个线程中。此时,appender不知道或不关心父母。有人可能会争辩说,这个用例是AsyncAppender类存在的原因。

如果您愿意,可以check it out for yourself

您可以自己测试的一种方法是在记录内容之前使AsyncAppender长时间(比如说10秒)睡眠。在父线程中将某些内容记录到appender并观察它到appender。你应该看到你的父线程“结束”(我怀疑它在Tomcat中只是意味着它被循环回到一个池中)并且appender仍应该继续工作。