Rails LogRotate 文件到另一个目录

Rails LogRotate files to another directory

我的应用程序中有一个 rails 自定义记录器。

class ApplicationController < ActionController::API
  @@logger = nil

  def custom_logger
    return @@logger if @@logger
    FileUtils.touch(Rails.root.join('log/custom.json'))
    @@logger = Logger.new(Rails.root.join('log/custom.json'), shift_age = 'daily')
    @@logger.level = Logger::INFO
    @@logger.formatter = proc do |severity, datetime, progname, msg|
      "#{msg}\n"
    end
    @@logger
  end
end

在我的应用程序中,我可以使用

记录消息
custom_logger.info "My log message"

我的自定义日志消息和轮换的文件记录如下

这是我的要求

  1. 旋转的文件应该放在不同的位置,即 //current/log/archive/custom.json.20210712
  2. 旋转文件的名称也应该有小时和分钟,即我需要 custom.json.202107121020 而不是 custom.json.20210712。格式 custom.json.{yyyyMMddHHmm,UTC}

我可以使用 Logger class 或任何其他记录器 gem 或通过继承 Logger class.

编写我自己的记录器 class

在实例化 Logger 时,第一个要求是 将存档日志放在不同的路径中是不可能的。替代方法是使用 cronjob 或后台作业。

而且,更改文件名的第二个要求是通过在选项中传递 shift_period_suffix 键来实现。

    @@logger = Logger.new(Rails.root.join('log/custom.json'), shift_age = 'daily', shift_period_suffix: "%Y%m%d%H%m, %Z")

发布第一个需求的解决方案。 记录器没有给我们提供将旋转文件添加到 archive 路径的方法。

所以在返回记录器对象之前,我正在检查目录中是否有旋转文件。如果它们存在,则将文件移动到存档路径。

class ApplicationController < ActionController::API
  @@logger = nil

  def custom_logger
    rolled_files = Find.find(Rails.root.join('log').grep(/custom.json.[\d]{12}/)
    mv_rolled_files(rolled_files) if !rolled_files.empty?
    return @@logger if @@logger
    FileUtils.touch(Rails.root.join('log/custom.json'))
    @@logger = Logger.new(Rails.root.join('log/custom.json'), shift_age = 'daily')
    @@logger.level = Logger::INFO
    @@logger.formatter = proc do |severity, datetime, progname, msg|
      "#{msg}\n"
    end
    @@logger
  end

  private

  def mv_rolled_files(rolled_files)
    # Move rotated files to an archive location.
  end
end

我知道这不是一个有效的方法。在找到更好的方法之前,我将暂时采用当前方法。