首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步日志记录

异步日志记录
EN

Stack Overflow用户
提问于 2013-06-10 15:01:04
回答 5查看 21.7K关注 0票数 13

现在在我的应用程序中,在某些情况下,我们会将一些繁重的内容记录到日志文件中。

基本上,我们只为日志创建可用数据的JSON,然后登录到Log files.This是以JSON格式记录数据的业务需求。

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

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

代码语言:javascript
复制
Executors.newSingleThreadExecutor() 

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

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

如果有人能分享更好的解决方案,我将不胜感激。在这个.I中使用Log4j的一些方法尝试使用AsyncAppender,但是没有达到任何预期的结果。我们使用的是EJB3、Jboss 5.0、Log4j、java6。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-06-10 15:07:59

我相信您在使用单独的线程池进行日志记录方面是正确的。在许多产品中,您将看到异步日志记录功能。使用与请求线程不同的线程来累积日志并将其推送到日志文件。特别是在生产环境中,有数百万个传入请求,您的响应时间需要少于几秒。你不能承受任何像日志记录这样的东西来降低系统的速度。因此,使用的方法是在内存缓冲区中添加日志,并以合理大小的块异步推送它们。

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

票数 7
EN

Stack Overflow用户

发布于 2013-06-10 15:11:03

看看Logback,AsyncAppender它已经提供了单独的线程池,队列等,并且很容易配置,它几乎和你正在做的一样,但省去了你重新发明轮子的麻烦。

票数 6
EN

Stack Overflow用户

发布于 2013-06-10 15:07:11

是否考虑使用MongoDB for logging

  1. MongoDB插入可以通过异步完成。如果日志记录缓慢、停滞或停顿,人们不会希望用户的体验陷入停顿。MongoDB提供了触发对日志集合的插入而不等待响应代码的能力。(如果需要响应,可以调用getLastError() -我们可以跳过这一步。)
  2. 旧日志数据会自动从LRU中删除。通过使用上限收集,我们为日志预先分配了空间,一旦空间已满,日志就会包装并重用指定的空间。没有用过多的日志信息填满磁盘的风险,也不需要编写日志归档/删除脚本。
  3. 对于这个问题来说已经足够快了。首先,MongoDB通常非常快,对于这样的问题来说已经足够快了。其次,当使用一个有上限的集合时,插入顺序是自动保留的:我们不需要在时间戳上创建索引。这使得事情变得更快,并且非常重要,因为与读取相比,日志记录用例具有非常高的写入数量(与大多数数据库problems).
  4. Document-oriented / JSON相反,JSON是日志信息的一种很好的格式。非常灵活和“无模式”,因为我们可以在任何时候想要的时候抛出一个额外的字段。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17018420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档