【问题标题】:Rails save log data to databaseRails 将日志数据保存到数据库
【发布时间】:2019-04-04 17:49:12
【问题描述】:

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

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

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

这背后的原因是在 docker 容器中运行了多个 rails api。我设置了一个后续操作来运行后台作业,我希望它只发送单个日志条目,但这是我卡住的地方。大小不是问题,因为存储在此数据库中的数据每 2 周清除一次。这也是内部开发人员通过仪表板跟踪遥测的工具。感谢您抽出宝贵时间回复

【问题讨论】:

标签: ruby-on-rails logging


【解决方案1】:

所以我找到了一个可行的解决方案,公平地说,它并没有我想象的那么困难。当我使用 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 格式化数据,但另一个解决方案是创建一个自定义记录器,在那里我可以告诉它在必要时写入数据库。

【讨论】:

    【解决方案2】:

    您可能必须检查您的应用程序代码并手动将记录器的输出保存到数据库内联的表/字段中。从理论上讲,最终出现在您的日志中的任何数据都应该可以从您的应用程序中访问。

    根据您计划保存多少数据,这可能不是最好的主意,因为它有可能非常快速地增长您的数据库(应用程序在一天内创建价值 GB 的日志并不少见) .

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

    【讨论】:

    • @cassidb7 酷。如果您不介意在您的问题中添加该说明,我将删除此答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    相关资源
    最近更新 更多