【问题标题】:Writing own appender by extending AppenderSkeleton?通过扩展 AppenderSkeleton 编写自己的附加程序?
【发布时间】:2013-10-18 13:12:46
【问题描述】:

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

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 邮件 API 发送这些详细信息。当我使用AsyncAppender时,它不会阻塞父线程并且MyAppender逻辑是使用单独的线程异步执行的。我的问题是父线程是否在MyAppender逻辑完成之前完成了它的执行,那么是否有任何保证逻辑inMyAppender 即使父线程完成执行也会完成?

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

谢谢!

【问题讨论】:

    标签: java logging log4j java-ee-6


    【解决方案1】:

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

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

    您可以自己测试的一种方法是创建一个 AsyncAppender,它会在记录某些内容之前休眠很长时间(比如 10 秒)。将某些内容记录到父线程中的 appender 并观察它进入 appender。您应该看到您的父线程“结束”(我怀疑在 Tomcat 中实际上只是意味着它被回收回池中)并且附加程序仍然应该完成它的工作。

    【讨论】:

    • 我的问题是如果父线程执行完成但异步记录器线程仍在执行中怎么办?即使父线程退出,异步记录器线程执行是否也会完成?我的应用程序部署在 tomcat..
    • 是的,没关系。它们是不同的线程。一旦你的 async appender 收到消息,它就不会知道或关心父级做了什么。
    • 哦..好的..那么总是保证异步记录器线程执行完成对吗?举个例子:如果父线程需要 2 秒来完成执行,而异步记录器线程需要 10 秒,那么仍然可以保证异步记录器线程执行完成对吗?
    猜你喜欢
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多