我有兴趣将所有Rails应用程序日志记录发送到数据库(MySQL或MongoDB),作为日志文件的补充或替代。有几个原因,其中大多数都关注日志文件分析。我们已经使用了Google Analytics(分析),但我们想要做的各种事情在Google Analytics中并不可行。
此外,我想通过查看日志来对问题进行“实时”调查。筛选日志文件是一种繁琐的方法,我希望能够比日志文件(轻松)更好地进行搜索和过滤。
最后,我经常想要检查更接近网站访问者行为的内容:例如,跟踪网站中的路径,以便我可以看到在发生错误之前用户正在查看的最后一页是什么。鉴于我们有多个应用服务器,单独的日志文件使这真的很痛苦。如果所有数据都在数据库中,那么我可以很容易地看到给定访问者的正确页面序列。我知道Syslog是解决这个特定事物的一种方式(单个日志文件/存储库),但我希望将它与我与数据库搜索相关联的更好的搜索能力结合起来。
我想知道人们建议解决这个问题。您是直接登录到数据库,还是将日志文件转储到数据库中(但是您的方法是什么,以便它基本上是实时/最新的日志文件本身)?
我目前正在确定我喜欢这种日志记录的级别,因为我看到的另一件事是编写一个可以记录所有请求的小型Rack过滤器。这将错过正常Rails日志记录转储出来的所有额外输出(缓存命中和未命中的所有SQL和输出等),但它将实现我的目标的很大一部分,并且似乎具有不打扰的优势系统中的任何其他内容。
无论如何,我不是在寻找一个正确的答案,更多的是关于其他人可能在同样的事情中做什么的讨论和信息。
答案 0 :(得分:40)
我公司已将一些结构化流量信息直接记录到MySQL日志数据库中。此数据库将下游复制到另一个数据库。所有分析都运行在最终的数据库复制中。我们的网站维持了相当多的流量。到目前为止,它似乎没有任何重大问题。但是,我们的IT部门对当前设置的可扩展性有一些日益增长的担忧,并建议我们将日志信息卸载到“正确”的日志文件中。然后将日志文件重新插入到相同的下游数据库表中。这让我想到了这个问题。 :)
以下是我看到的关于日志文件与log-db(关系)主题的一些优缺点:
我认为在我的情况下需要对日志数据库进行一些压力测试。这样至少我知道我有多少空间。
最近,我一直在研究一些基于键值/文档的数据库,如Redis,Tokyo Cabinet和MongoDB。这些快速插入数据库可能是最佳选择,因为它们提供持久性,高(写入)吞吐量和不同程度的查询功能。它们可以使数据提取过程比通过日志文件的数据解析和映射减少简单得多。
从长远来看,我认为拥有一个强大的分析数据仓库至关重要。从分析数据中释放应用程序数据(反之亦然)可能是一个很大的胜利。
最后,我想指出StackOverflow上有许多类似/密切相关的问题,以防您想扩大讨论范围。
编辑:
rsyslog看起来非常有趣。它使您能够直接写入MySQL。如果您使用的是Ruby,那么您应该查看日志记录gem。它提供多目标日志记录功能。这太好了。
答案 1 :(得分:9)
如果要更改默认日志记录行为,只需创建一个响应所有Rails记录器方法的自定义记录器对象:
因为它是您的记录器,您可以决定实施您的个人逻辑。 您可以随时写入数据库,标准输出。
然后,替换要自定义的每个基类的默认记录器。
ActiveRecord::Base.logger = YouLogger.new
您可以轻松创建名为logger.rb的初始化文件,并在其中写下所有自定义配置。通过这种方式,Rails启动时会立即替换记录器。
答案 2 :(得分:3)
我使用rails "exception logger",在我的网站处于生产模式时将所有问题记录到我的数据库中。它会为您提供一个很好的界面,您可以在其中检查问题。如果您想要实时查看访问者的行为,请查看woopra
答案 3 :(得分:1)
克里斯,
我认为Dima的评论在这里很重要。您是否满意(1)在数据库中实时访问日志(或实时),或者(2)您对Rails /特定于应用程序的日志记录更感兴趣吗?
对于(1),使用Apache(至少),您可以使用管道记录来登录数据库。
http://httpd.apache.org/docs/1.3/logs.html#piped
我编写了一个在后台运行的程序,等待输入,它解析并记录到Postgres DB。我的httpd.conf文件使用CustomLog指令管道到这个程序。
设置起来相对简单,并且为您提供了分析数据库中日志的所有明显优势。它对我来说非常有效,特别是在错误发生之前跟踪用户正在做的事情。但是,您必须在日志记录程序中防止sql注入,缓冲区溢出和其他安全问题。
对于(2),我不是Rails开发人员所以我只能谈论一般方法。如果要记录环境变量,应用程序数据或非常有选择性的信息,可以考虑编写Web服务器模块。根据您的确切需求,您还可以在日志记录程序中使用条件记录指令和过滤的一些组合。
这真的取决于您是否需要特定于Rails的解决方案或更一般的Web服务器范围的解决方案。
答案 4 :(得分:1)
因为直到现在还没有接受答案,我会给出我的贡献
我确实为rsylog开发了一个插件来保存不在文件中但不在mongodb中的日志
整个源代码,来自rsyslog +插件,在这里https://github.com/vpereira/rsyslogd-mongo
要编译它,你应该运行./configure --help并查看可用的选项。
答案 5 :(得分:1)
我最近自己错误地登录了数据库,我觉得我可以提供一个非常好的理由,为什么你不应该这样做:交易。让我们说你开始一个交易,在交易过程中记录一堆东西,最终你得到一个错误条件。你记录错误情况,哦,嘿。 ROLLBACK
。突然之间,您刚刚记录的所有内容都消失了,您不知道发生了什么或为什么。
特别是在Rails环境中,像AASM这样真正有用的库会在事务中包含大量内容,你可以在你认为不会想到的地方进行交易,这也使得问题很难调试。
就我而言,我将数据记录到数据库的原因是我需要上下文相关的日志。基本上我需要能够查找与特定数据库模型相关的所有日志条目。但是,正确的答案是将这些日志放在一个更适合日志数据的单独位置(在我的情况下,它恰好可以查询)。