Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过扩展AppenderSkleton来编写自己的appender?_Java_Logging_Log4j_Java Ee 6 - Fatal编程技术网

Java 通过扩展AppenderSkleton来编写自己的appender?

Java 通过扩展AppenderSkleton来编写自己的appender?,java,logging,log4j,java-ee-6,Java,Logging,Log4j,Java Ee 6,我正在使用log4jAsyncAppender。我编写了自己的appender来定制记录器,如下所示 public class MyAppender extends AppenderSkeleton { @Override public void close() { } @Override public boolean requiresLayout() { return false; } @Override

我正在使用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配置:

现在一切正常。Im
MyAppender
我将启动一个
Select
查询,从表中获取一些详细信息,并使用java邮件API发送这些详细信息。由于我使用的是
AsyncAppender
,它不阻止父线程,并且MyAppender逻辑使用单独的线程异步执行。我的问题是,如果父线程在
MyAppender
逻辑完成之前完成其执行,那么是否可以保证
MyAppender
中的逻辑将完成,即使父线程完成其逻辑的执行处决

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


谢谢

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

如果你愿意,你可以


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

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

如果你愿意,你可以


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

我的问题是,如果父线程执行完成,但异步记录器线程执行仍在进行中,该怎么办?异步记录器线程执行是否将在父线程退出后完成?我的应用程序部署在tomcat上..是的,很好。它们是不同的线程。一旦异步appender收到消息,它就不知道或不关心父线程做了什么。哦..好的..那么始终异步记录器线程执行完成是有保证的,对吗?考虑一个例子:如果父线程占用2SES完成执行,异步记录器线程占用10SES,那么仍然保持异步记录器线程Excel完成是否正确?我的问题是如果父线程ExEXECUTE完成,但仍然是异步记录器线程执行正在进行中?异步记录器线程执行是否将在父线程退出后完成?我的应用程序部署在tomcat上..是的,很好。它们是不同的线程。一旦异步appender收到消息,它就不知道或不关心父线程做了什么。哦..好的..那么始终异步记录器线程执行完成是有保证的,对吗?考虑一个例子:如果父线程占用2SES完成执行,异步记录器线程占用10SES,那么仍然保持异步记录器线程Excel完成正确吗?
<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>