5

我在我的应用程序中使用 Log4J AsyncAppender,我想知道,当我的应用程序完成时,AsyncAppender 的线程会发生什么?我应该手动终止线程还是可以忘记它并退出我的应用程序而不必担心某些日志消息会丢失?

4

3 回答 3

2

如果您LogManager.shutdown()在 JVM 关闭之前调用,它将继续运行,直到刷新附加程序。请注意,这仅对 log4j 1.x 是必需的。我从文档中了解到 Log4j 2 会自动注册一个关闭挂钩来处理这个问题。

于 2015-01-07T21:38:09.220 回答
1

查看 AsyncAppender 的源代码,它创建了一个守护线程(第 112-117 行)来处理写入事件,作者希望您显式调用close()appender 以确保在 JVM 关闭之前写出所有排队的消息:

dispatcher = new Thread(new Dispatcher(this, buffer, discardMap, appenders));

// It is the user's responsibility to close appenders before
// exiting.
dispatcher.setDaemon(true);

通过将线程设置为守护进程,这意味着一旦您的应用程序的核心退出,JVM 将不会继续运行。但是,这也意味着如果您的应用程序在没有通知 appender 的情况下关闭,队列中的任何消息都会丢失。

于 2012-10-10T14:41:12.400 回答
0

如果 AsyncAppender 是在您的应用程序中运行的线程,那么它将在您关闭应用程序时关闭(我所说的应用程序是指 jvm 的当前实例)。我不知道这是否是你的问题

于 2012-10-10T14:14:16.333 回答