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
相关产品推荐
相关产品推荐

