login到数据库而不是日志文件

我感兴趣的是将所有的Rails应用程序日志logging发送到数据库(MySQL或MongoDB),除了日志文件之外,或者不是日志文件。 有几个原因,其中大部分是关于日志文件分析。 我们已经使用Google Analytics(分析),但是我们想要做的事情在Google Analytics中不可行。

此外,我想通过查看日志来对问题进行“实时”调查。 通过日志文件筛选是一个乏味的方式来做到这一点,我想更好地search和筛选比日志文件(容易)允许。

最后,我经常想要检查一些更接近网站访问者行为的东西:例如通过网站追踪path,以便我能够在发生错误之前查看用户正在查看的最后一页。 鉴于我们有多个应用程序服务器,单独的日志文件使这成为一个真正的痛苦。 如果所有数据都在数据库中,那么我可以很容易地看到给定访问者的正确页面顺序。 我知道Syslog是解决这个问题的唯一方法(单个日志文件/存储库),但是我想把它与更好的search能力结合起来,以便与数据库search相关联。

我想知道人们推荐解决这个问题。 你是直接login到数据库,还是将日志文件转储到数据库(但是你的方法是什么,以便它本质上是实时/最新的日志文件本身)?

我目前正在确定什么级别,我想这个日志logging,因为我看的另一件事是写一个小的机架filter,将logging所有请求。 这会错过正常的Rails日志输出的所有额外输出(所有的SQL和输出caching命中和未命中等),但它会实现我的目标很大一部分,似乎有不打扰系统中的其他任何东西。

无论如何,我不是在寻找一个正确的答案,更多的是关于其他人可能以同样的方式做什么的讨论和信息。

我的公司已经将一些结构化的交通信息直接logging到MySQL日志数据库中。 该数据库被下游复制到另一个数据库。 所有分析运行最终的数据库复制。 我们的网站保持相当的stream量。 到目前为止,似乎没有任何重大问题。 但是,我们的IT部门对于当前设置的可扩展性有着越来越多的担忧,并build议我们将日志信息卸载到“正确的”日志文件中。 日志文件将被重新插入到相同的下游数据库表中。 这使我想到了这个问题。 🙂

下面是我看到关于日志文件与log-db(关系)主题的一些优点和缺点:

  • 日志文件是快速,可靠和可扩展的(至less我听说过雅虎使用日志文件大量使用他们的点击跟踪分析)。
  • 日志文件很容易被系统pipe理员维护。
  • 日志文件可以非常灵活,因为你几乎可以写任何东西。
  • 日志文件需要大量parsing,并且可能需要一个映射简化的数据提取设置。
  • 日志数据库结构离您的应用程序更近,使得某些function的转换时间缩短了很多。 这可能是一个祝福或诅咒。 从长远来看,这可能是一个诅咒,因为你很可能会得到一个高度耦合的应用程序和分析代码库。
  • log-db可以减less日志logging的噪音和冗余,因为日志文件只能在log-db中插入,这样就可以进行更新和关联插入(如果你敢的话,标准化)。
  • 如果使用数据库分区和/或多日志数据库(通过下游复制重新join数据),则log-db也可以快速且可扩展。

我想在我的情况下需要对日志数据库进行一些压力testing。 至less我知道我有多less空间。

最近,我一直在研究Redis,Tokyo Cabinet和MongoDB等基于键值/文档的数据库。 这些快速插入数据库可能是最佳select,因为它们提供了持久性,高(写)吞吐量和不同程度的查询能力。 他们可以使数据提取过程比通过演出日志文件parsing和缩小图更简单。

从长远来看,我认为拥有强大的分析数据仓库至关重要。 从分析数据中释放应用程序数据,反之亦然可能是一个很大的胜利。


最后,我只想指出,如果你想扩大你的讨论范围,StackOverflow中有很多类似的/密切相关的问题。

  • 存储许多日志文件
  • 将服务器日志文件写入数据库是一个好主意?
  • 使用SQL Server进行应用程序日志logging。 优点缺点?
  • 在日志中快速search
  • 独立的生产数据库logging
  • 您login到您的数据库,您的数据库closures时,您在哪里login?

编辑:

rsyslog看起来很有趣。 它使您能够直接写入MySQL。 如果你正在使用Ruby,你应该看看日志gem。 它提供了多目标loggingfunction。 这太好了。

如果您想更改默认的日志logging行为,只需创build一个响应所有Railslogging器方法的自定义logging器对象:

  • debugging,警告,错误,信息,致命,未知

http://github.com/rails/rails/blob/9d7aae710384fb5f04129c35b86c5ea5fb9d83a9/activesupport/lib/active_support/buffered_logger.rb

因为这是你的logging器,你可以决定实现你的个人逻辑。 你可以写到数据库,只要你想要的标准输出。

然后,replace您想要自定义的每个基类的默认logging器。

ActiveRecord::Base.logger = YouLogger.new 

您可以轻松地创build一个名为logger.rb的初始化文件,并在其中写入所有自定义configuration。 这样,logging器将在Rails启动时立即被replace。

我使用轨道“exceptionlogging器” ,将所有问题logging到我的数据库,而我的网站处于生产模式。 它会给你一个很好的界面,你可以检查问题。 如果你想看看你的访客正在做什么,然后看看woopra

克里斯,

我认为迪马的评论在这里很重要。 你对(1)在DB(实时)访问日志,或者(2)你对Rails /应用程序特定日志感兴趣吗?

对于(1),使用Apache(至less),您可以使用pipe道日志logging来login到数据库。

http://httpd.apache.org/docs/1.3/logs.html#piped

我写了一个程序,在后台运行,等待input,parsing并logging到Postgres数据库。 我的httpd.conf文件通过一个CustomLog指令pipe道到这个程序。

这是相对简单的设置,并给你所有能够分析您的日志在数据库中的明显优势。 它对我来说工作得非常好,特别是在错误发生之前追踪用户的行为。 但是,您必须防止SQL注入,缓冲区溢出以及日志程序中的其他安全问题。

对于(2),我不是Rails开发者,所以我只能谈论一般的方法。 如果您想logging环境variables,应用程序数据或非常多的信息,可以考虑编写一个Web服务器模块。 根据您的具体需要,您还可以通过组合条件logging指令和日志logging程序中的过滤来获得。

这实际上取决于您是否需要一个Rails特定的解决scheme或更一般的Web服务器范围的解决scheme。

因为直到现在还没有答案被接受,我会给我的贡献

我没有开发一个插件来rsylog保存日志不是在文件,而是在mongodb

整个源代码,从rsyslog +插件在这里https://github.com/vpereira/rsyslogd-mongo

编译它,你应该运行./configure –help并查看可用的选项。

最近自己写了一个数据库的错误,我觉得我可以提供一个非常好的理由,为什么你不应该这样做:事务。 比方说,你开始一个交易,在交易过程中logging一堆东西,最终你会得到一个错误的情况。 你logging错误情况,嘿嘿。 ROLLBACK 。 突然之间,你所logging的一切都消失了,你不知道发生了什么或者为什么。

特别是在Rails的情况下,像AASM这样真正有用的库将一大堆东西包装在一个事务中,最终可能会在你不认为你会的地方进行事务处理,这也使得这个问题很难debugging。

就我而言,我把事情logging到数据库的原因是我需要上下文敏感的日志。 基本上我需要能够查找与特定数据库模型相关的所有日志条目。 然而,正确的答案是把这些日志放在一个更适合日志数据的独立位置(在我的情况下,恰好是可查询的)。