perl - MongoDB 日志记录

标签 perl mongodb logging

我正在构建一个日志系统,该系统将记录对分布在多个应用程序节点上的 Web 服务的请求和响应。我正在考虑使用 MongoDB 作为存储库并实时登录,或者更实际地在 x 次请求后将日志转储到数据库。该应用程序被设计成相当大的容量,并且是用 Perl 构建的。有没有人有这样做的经验?建议?或者这是一个禁忌?

最佳答案

我看到很多公司都在使用 MongoDB 来存储日志。它的模式自由对于应用程序日志来说非常灵活,在这种情况下模式往往会不时更改。此外,它的 Capped Collection功能非常有用,因为它会自动清除旧数据以保持数据适合内存。

人们通过正常分组或 MapReduce 聚合日志,但它并没有那么快。特别是MongoDB的MapReduce只在单线程内工作,JavaScript执行开销巨大。 New aggregation framework可以解决这个问题。

另一个问题是高写入吞吐量。虽然 MongoDB 的 insert 默认是 fire-and-forget 样式,但是调用大量的 insert 命令会导致严重的写锁争用。这可能会影响应用程序性能,并阻止读者聚合/过滤存储的日志。

一种解决方案可能是使用日志收集器框架,例如 Fluentd , Logstash , 或 Flume .这些守护进程应该在每个应用程序节点上启动,并从应用程序进程中获取日志。

fluentd plus mongodb

他们缓冲日志并将数据异步写出到其他系统,如 MongoDB/PostgreSQL 等。写入是分批完成的,因此比直接从应用程序写入要高效得多。此链接描述了如何将日志从 Perl 程序放入 Fluentd。

关于perl - MongoDB 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8884701/

相关文章:

perl - 在 Perl 中,如何从子例程返回绑定(bind)的哈希?

node.js - Mongoose 关注/关注者

java - log4j 中不生成日志文件

json - MongoDB - 动态更新嵌套数组中的对象

mongodb - 有什么方法可以保证从用户端进行交易

java - Spring项目部署抛出org.apache.commons.logging.Log的ClassNotFoundException

php - 为什么我对带有文本字段的大型表的 MySQL 查询非常慢,尽管有索引并且查询时间据说很短?

perl - 如何在 perl 中返回一个空数组/长度为 0 的数组?

perl - 如何使用 fastcgi 和 perlbrew 为在 nginx 上运行的 Perl 催化剂应用程序创建初始化脚本

perl - 子例程返回空字符串而不是哈希引用