You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails自定义Logger配置日志转存路径与带时分UTC文件名方案

方案可行性说明

1. 原生Logger类

Ruby自带的Logger类的轮转逻辑是内置固化的,没有提供公开配置项可以直接自定义轮转后的文件存储路径、文件名格式,无法直接满足你的需求。

2. 第三方日志Gem

可以通过成熟的第三方日志库实现,比如logging gem,内置了灵活的轮转策略配置,支持自定义归档路径、文件名时间格式,无需自己实现轮转逻辑,适合不想维护自定义日志类的场景。

3. 继承Logger类自定义实现

最推荐的方案,无额外依赖,灵活性最高,只需要重写Logger类负责周期轮转的shift_log_period方法,在方法内实现自定义的文件命名、归档路径移动逻辑即可完全匹配你的需求。


自定义Logger实现示例

首先在lib/custom_logger.rb中定义自定义日志类:

require 'logger'
require 'fileutils'

class CustomLogger < Logger
  # 归档目录路径,可根据需求调整
  ARCHIVE_DIR = Rails.root.join('log', 'archive')

  def initialize(log_file, shift_age = 'daily')
    # 初始化时自动创建归档目录
    FileUtils.mkdir_p(ARCHIVE_DIR) unless File.exist?(ARCHIVE_DIR)
    super(log_file, shift_age)
  end

  # 重写周期轮转核心方法
  def shift_log_period(period_end)
    # 生成UTC时间的时分后缀
    timestamp = period_end.utc.strftime("%Y%m%d%H%M")
    archived_file_path = File.join(ARCHIVE_DIR, "custom.json.#{timestamp}")

    # 关闭当前日志文件句柄
    @dev.close if @dev.respond_to?(:close)

    # 移动轮转后的日志到归档目录
    File.rename(@filename, archived_file_path) if File.exist?(@filename)

    # 创建新的空白日志文件
    @dev = File.open(@filename, 'a')
    @dev.sync = true
  end
end

然后修改你原有控制器中的日志初始化逻辑:

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

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

内容的提问来源于stack exchange,提问作者Rajuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:27:03