异步日志记录

现在在我的应用程序中,在某些时候,我们会将一些沉重的东西记录到日志文件中。

基本上,仅用于日志记录,我们创建可用数据的JSON,然后登录到日志文件。这是以 JSON 格式记录数据的业务需求。

现在,从可用数据创建 JSON,然后记录到 FILE 需要花费大量时间,并且会影响原始请求返回时间。现在的想法是改善位置。

我们已经讨论过的一件事是使用

Executors.newSingleThreadExecutor() 

在我们的代码中,然后将任务提交给它,该任务将数据转换为JSON并随后进行日志记录。

这样做是一个好方法吗?当我们管理线程池本身时,它是否会产生一些问题?

如果有人能分享更好的解决方案,我将不胜感激。以某种方式使用Log4j来实现这一点。我试图使用AsyncAppender,但没有达到任何预期的结果。我们使用的是EJB 3,Jboss 5.0,Log4j,java6。


答案 1

我相信您在使用单独的线程池进行日志记录方面走在正确的轨道上。在许多产品中,您将看到异步日志记录功能。日志使用与请求线程不同的线程进行累积并推送到日志文件。特别是在生产环境中,有数百万个传入请求,您的响应时间需要不到几秒钟。您负担不起诸如日志记录之类的任何东西来减慢系统的速度。因此,使用的方法是在内存缓冲区中添加日志,并在合理大小的块中异步推送它们。

使用线程池进行日志记录时的注意事项由于多个线程将在日志文件和内存日志缓冲区上工作,因此您需要小心日志记录。您需要在 FIFO 类型的缓冲区中添加日志,以确保日志打印在按时间戳排序的日志文件中。还要确保文件访问是同步的,并且您不会遇到日志文件全部颠倒或混乱的情况。


答案 2

看看Logback,AsyncAppender它已经提供了单独的线程池,队列等,并且易于配置,它几乎和你一样,但可以节省你重新发明轮子的时间。


推荐