Java Log42异步记录器在应用程序突然关闭时的行为如何?

Java Log42异步记录器在应用程序突然关闭时的行为如何?,java,asynchronous,logging,log4j2,Java,Asynchronous,Logging,Log4j2,对于异步日志记录,尚未写入目标appender且应用程序/系统停机的日志会发生什么情况?我们是否丢失了这些日志(因为它们在内存中),或者是否有方法恢复它们 我不想丢失任何错误级别日志记录。所以我的下一个问题是:有没有办法在日志级别为单个appender配置同步和异步日志记录?例如,我希望我的文件追加器同步执行错误级别日志记录,同时异步执行信息/调试 提前谢谢 如果进程正常终止,队列中的所有事件都将被处理。有关AsyncLogger关机的详细工作方式,请参阅 如果不允许该进程进行清理(例如,kil

对于异步日志记录,尚未写入目标appender且应用程序/系统停机的日志会发生什么情况?我们是否丢失了这些日志(因为它们在内存中),或者是否有方法恢复它们

我不想丢失任何错误级别日志记录。所以我的下一个问题是:有没有办法在日志级别为单个appender配置同步和异步日志记录?例如,我希望我的文件追加器同步执行错误级别日志记录,同时异步执行信息/调试


提前谢谢

如果进程正常终止,队列中的所有事件都将被处理。有关AsyncLogger关机的详细工作方式,请参阅

如果不允许该进程进行清理(例如,
kill-9
),则可能会丢失事件。这就是生活


如果希望同步处理错误级别日志事件,但异步处理其他级别的日志事件,则可能无法使用AsyncLogger,但可以使用AsyncAppender。您可以将记录器配置为路由到FileAppender和AsyncAppender。AsyncAppender路由到FileAppender。然后使用过滤器使AsyncAppender只接受INFO及以下,而FileAppender接受ERROR及以上

如果进程正常终止,队列中的所有事件都将被处理。有关AsyncLogger关机的详细工作方式,请参阅

如果不允许该进程进行清理(例如,
kill-9
),则可能会丢失事件。这就是生活


如果希望同步处理错误级别日志事件,但异步处理其他级别的日志事件,则可能无法使用AsyncLogger,但可以使用AsyncAppender。您可以将记录器配置为路由到FileAppender和AsyncAppender。AsyncAppender路由到FileAppender。然后使用过滤器使AsyncAppender只接受INFO及以下,而FileAppender接受ERROR及以上

谢谢!当您混合使用同步和异步附加器(如上所述)与所有同步记录器(仅针对错误级别)时,对性能有何影响?另外,异步附加器不使用LMAX中断器技术(而是使用ArrayBlockingQueue)——所以仍然建议使用混合方法吗?为了澄清,我们的应用程序在Log4j 1.x上,并且计划在Log4j 2.x中更新为异步日志记录。目前,我们在应用程序中只使用sync appender(控制台和JDBC),并且由于log4j1.x中的线程争用锁问题,我们在生产部署中将日志级别设置为ERROR。由于错误日志级别的原因,很难调试prod部署中的任何问题。我们正在考虑升级到Log4J 2.x并使用异步日志记录,以便在产品部署中打开信息/调试日志记录。请注意,控制台appender和JDBC appender都很慢。异步日志允许您在没有线程争用的情况下快速将事件排队,这很好,但缓慢的附加器意味着您的队列将在应用程序繁忙时填满。队列的大小预先设定为大,但一旦队列满了,您需要阻塞直到空间变为可用,或者开始删除事件(请参阅AsyncQueueFullPolicy)。如果您需要记录的内容超过基础Appender所能跟上的,异步记录器将不会帮助您。如果您需要大量登录,请考虑将日志记录到所有日志记录器异步的文件中(使用中断器)。谢谢!奇怪的是,为什么控制台appender(我假设是sysout或syserr)与登录到文件(涉及I/O)相比速度慢?此外,向数据库写入日志信息的推荐方法是什么(如果JDBCAppender被认为速度慢)?我们的web应用程序从日志数据库表中提取数据,并将其显示在UI中供用户查看。NoSQL数据库以快速吞吐量著称,日志记录可能是一个很好的用例。我怀疑任何数据库都会比文件记录更快。如果这成为性能瓶颈,您可以考虑更改Web应用程序来读取/尾随日志文件而不是数据库。谢谢!当您混合使用同步和异步附加器(如上所述)与所有同步记录器(仅针对错误级别)时,对性能有何影响?另外,异步附加器不使用LMAX中断器技术(而是使用ArrayBlockingQueue)——所以仍然建议使用混合方法吗?为了澄清,我们的应用程序在Log4j 1.x上,并且计划在Log4j 2.x中更新为异步日志记录。目前,我们在应用程序中只使用sync appender(控制台和JDBC),并且由于log4j1.x中的线程争用锁问题,我们在生产部署中将日志级别设置为ERROR。由于错误日志级别的原因,很难调试prod部署中的任何问题。我们正在考虑升级到Log4J 2.x并使用异步日志记录,以便在产品部署中打开信息/调试日志记录。请注意,控制台appender和JDBC appender都很慢。异步日志允许您在没有线程争用的情况下快速将事件排队,这很好,但缓慢的附加器意味着您的队列将在应用程序繁忙时填满。队列的大小预先设定为大,但一旦队列满了,您需要阻塞直到空间变为可用,或者开始删除事件(请参阅AsyncQueueFullPolicy)。如果您需要记录的内容超过基础Appender所能跟上的,异步记录器将不会帮助您。如果您需要大量登录,请考虑将日志记录到所有日志记录器异步的文件中(使用中断器)。谢谢!奇怪的是,为什么控制台appender(我假设是sysout或syserr)与登录到文件(涉及I/O)相比速度慢?此外,向数据库写入日志信息的推荐方法是什么(如果JDBCAppender被认为速度慢)?我们的web应用程序从日志数据库表中提取数据,并将其显示在UI中供用户查看。NoSQL数据库以快速吞吐量著称,日志记录可能是一个很好的用例。我对此表示怀疑