Java 通过扩展AppenderSkleton来编写自己的appender?
我正在使用log4jJava 通过扩展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
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配置:
现在一切正常。ImMyAppender
我将启动一个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>