logging - 从文件日志记录转向数据库日志记录

标签 logging nosql

我们目前正在考虑从记录到文件转向记录到 NoSQL 数据库。我们公司的另一个团队正在开始使用 HBase,但这对于我们想要做的事情来说看起来相当复杂。我一直在研究 MongoDB,但我想要一些建议。

目前,我们在场中拥有数百台服务器,用于不同的应用程序。每当我们听到某个应用程序出现问题时,都会有一个漫长的过程从应用程序操作中检索日志,然后是一个漫长的过程来筛选所有日志以找到问题。我们正在考虑将所有日志记录转移到一个中心位置,并围绕它构建一个 Web UI,以便我们可以更轻松地访问和查询日志。

哪种 NoSQL 数据库最适合存储和查询应用程序日志?

最佳答案

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

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

当您使用 MongoDB 进行日志记录时,需要担心的是高写入吞吐量导致的锁争用。虽然 MongoDB 的插入默认是即发即忘风格,但调用大量 insert() 会导致严重的写锁争用。这可能会影响应用程序性能,并阻止读者聚合/过滤存储的日志。

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

它们缓冲日志并异步将数据写入其他系统,如 MongoDB/PostgreSQL/等。写入是按批量完成的,因此效率更高而不是直接从应用程序编写。此链接描述了如何将日志从 PHP 程序放入 Fluentd。

这里有一些关于 MongoDB + Fluentd 的教程。

MongoDB 的问题是当数据量超过内存大小时它开始变慢。此时,您可以切换到其他解决方案,例如 Apache HadoopCassandra。如果您有上面提到的分布式日志记录层,则可以随着您的发展切换到另一个解决方案。本教程介绍如何使用Fluentd将日志存储到HDFS。

关于logging - 从文件日志记录转向数据库日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11955131/

相关文章:

python - python 日志文件中的 "None"

sql - 如何比较两个表并返回与 HIVE 不同的行

mongodb - 为什么多值字段在关系数据库中不是一个好主意

database - 我如何更改redis中的数据库名称?

mongodb - 我们对 mongodb 使用 nosql 就像对 oracle 使用 sql 一样?

NoSQL Workbench 对 Dynamodb 中本地二级索引的支持

Python - 不同的日志应该位于不同的文件中,但出现在同一个文件中

exception - 错误日志数据库-对于许多应用程序

python - 如何在 Django 中记录所有的 sql 查询?

c# - NLog "final"规则的 Serilog 替代方案