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

标签 java logging log4j java-ee-6

我正在使用 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 逻辑完成之前完成其执行,那么即使父线程完成其执行,是否可以保证 MyAppender 中的逻辑将完成?

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

谢谢!

最佳答案

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

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

您可以自己测试这一点的一种方法是让 AsyncAppender 在记录某些内容之前 hibernate 很长时间(例如 10 秒)。将某些内容记录到父线程中的附加程序并观察它转到附加程序。您应该看到您的父线程“结束”(我怀疑在 Tomcat 中这实际上只是意味着它被回收回池中)并且附加程序仍然应该执行其工作。

关于java - 通过扩展AppenderSkeleton来编写自己的appender?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19450604/

相关文章:

java - 为什么这个简单的线程程序会卡住?

java - 使用 InputStream 和 Scanner 获得令人困惑的性能

jsp - 使用 log4j 的 Tomcat 日志记录?

java - JOOQ Log4j - 缺少控制台输出

perl - 使用 Log::Log4perl 制作自记录模块

java - 运行 Log4J HelloWorld 示例时遇到问题,出现 "package does not exist"错误

java - 我们如何实现车库门跟踪其最后移动方向?

java - 使用动态列名称更新表

java - 无法转换为 android.widget.AdapterView$OnItemSelectedListener

ruby - Sinatra 应用程序中的错误 "undefined local variable or method ` logger '"when using ` logger.info`