java - Log4j 异步附加器的使用?

标签 java multithreading logging log4j java-ee-6

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

公共(public)类 MyAppender 扩展 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.  

}

}

我的 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中的逻辑是否也能保证完成呢?

谢谢!

最佳答案

已经过去一年了,但为了我之后的其他人的利益,我会回答。安全关闭所有附加程序并确保 JVM 在日志记录完成之前不会关闭的正确方法是调用 LogManager.shutdown(); 。我还没有确认,但这在 Log4j 2 中显然是不必要的,因为它会自动向 JVM 注册一个关闭钩子(Hook)。

关于java - Log4j 异步附加器的使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19443698/

相关文章:

java - 这个简单的 'double' 计算有什么问题?

windows - 最大线程数

c - 使用 emscripten 的简单多线程程序

c++ - 从另一个线程发出信号是否安全?

java - Log4j2 没有记录到控制台

java - CompletableFuture 的意外行为

java - 无法将应用引擎端点导入 Android Studio 中的 EndpointsAsyncClass

java - 更新上传过程的进度对话框

Java:我该如何关闭包裹在 SLF4J 外观中的异步附加程序?

记录到 Blazor WASM 中的文件