Rails将日志数据保存到数据库

时间:2018-10-31 14:14:25

标签: ruby-on-rails logging

是否可以在不读取日志文件的情况下访问保存在Rails日志文件中的信息。明确地说,我不想将日志文件作为批处理发送,而是将写入日志文件的每个事件也作为后台作业发送到单独的数据库。

我有多个在docker容器中运行的应用程序,希望将每个应用程序的日志条目保存到服务器上运行的共享遥测数据库中。当前日志是使用lograge格式化的,但是我还没有弄清楚如何直接访问此信息并将其发送到后台作业进行处理(如前所述,我想直接访问写入日志的数据并将其发送通过后台作业)

我知道命令 Rails.logger.instance_variable_get(:@ l​​ogger),但是我正在寻找的是将实际数据保存到日志中,以便将其发送到数据库中。

其背后的原因是,Docker容器中正在运行多个Rails api。我设置了一个后处理程序来运行后台作业,我希望该作业仅发送单个日志条目,但这就是我遇到的问题。大小调整不是问题,因为存储在该数据库中的数据每2周要清除一次。此外,这是内部开发人员通过仪表板跟踪遥测的工具。感谢您抽出宝贵的时间来回复

2 个答案:

答案 0 :(得分:0)

您可能需要遍历应用程序代码,并将记录器的输出手动保存到数据库内联的表/字段中。从理论上讲,应该可以从您的应用程序中访问记录在日志中的所有数据。

取决于您计划保存多少数据可能不是最好的主意,因为它有可能非常快速地扩展数据库(应用程序一天创建价值GB的日志并不罕见)

您可以编写一个后台作业,以打开日志文件,搜索数据并将其保存到数据库,但是所需的配置在很大程度上取决于您的主机设置。

答案 1 :(得分:0)

所以我找到了一个可行的解决方案,而且公平地说,这并不像我想的那么困难。当我使用lograge gem格式化日志时,我通过此Link中的指南创建了一个自定义格式化程序。

由于我希望使用Son格式,所以我只是复制了这种格式,但此时可以进行后台作业,还可以清理一些我不想要的数据。

module Lograge
  module Formatters
    class SomeService < Lograge::Formatters::Json
      def call(data)
        data = data.delete_if do |k|
          [:format, :view, :db].include? k
        end

        ::JSON.dump(data)

        # faktory job to ship data
        LogSenderJob.perform_async(data)
        super
      end
    end
  end
end

这只是解决该问题的一种解决方案,因为我能够通过lograge格式化数据,但变得更容易了,但是另一种解决方案是创建一个自定义记录器,并在其中告诉我如有必要,可以将其写入数据库。