【问题标题】:Log rotation/clearing in Ruby on RailsRuby on Rails 中的日志轮换/清除
【发布时间】:2010-11-12 08:57:56
【问题描述】:

如何在 ruby​​ on rails 中设置 test.log 和 development.log 的自动清理?

是否有设置在服务器启动和测试运行时自动删除开发和测试日志?

【问题讨论】:

  • “清理”到底是什么意思?

标签: ruby-on-rails logging


【解决方案1】:

ruby logger 随时为您提供帮助 - 它具有轮换的默认选项。

这是我的工作:

environment.rb 中我们定义了自己的记录器

new_logger = Logger.new(File.join(RAILS_ROOT, "log", "new_logger_#{RAILS_ENV}.log"), 'daily')
new_logger.formatter = Logger::Formatter.new

这会创建我们自己的记录器...带有格式化程序(因此您可以获得时间戳等),每个环境都有一个,并且每天轮换。

然后在初始化块中我们要求 Rails 使用这个记录器

Rails::Initializer.run do |config|

  config.active_record.logger = new_logger
  config.action_controller.logger = new_logger

  #snip
end

您显然也可以在这里看到为active_recordaction_controller 提供不同记录器的强大功能 - 有时非常有用!

【讨论】:

  • 注意:在 Rails 3 中,您的“初始化块”位于 development.rb、production.rb 等中。
  • 另外,在 Rails 3 中,RAILS_ROOTRails.rootRAILS_ENVRails.env。看起来 Rails 社区不再使用大写锁定了?
【解决方案2】:

rake log:clear 是一个 rake 任务,它将所有匹配 log/*.log 的文件截断为零字节。 您可以在服务器启动和运行测试任务中调用它。

【讨论】:

  • +1 用于 rake 任务。同样,您也可以使用File.delete() 手动删除磁盘上的所有日志文件(请务必同时删除以.0.1 等结尾的所有翻转文件)。然后您可以使用@logger.reopen 重置记录器,它将重新创建日志文件
【解决方案3】:

所有脚本/服务器都是 ruby​​ 脚本,我相信你可以修改它来做类似的事情:

#!/usr/bin/env ruby
require 'fileutils'
FileUtils.rm File.join(File.dirname(__FILE__), log, *.log)
require File.dirname(__FILE__) + '/../config/boot'
require 'commands/server'

【讨论】:

    【解决方案4】:

    在生产环境中,你真的需要 SyslogLogger (http://rails-analyzer.rubyforge.org/tools/files/lib/analyzer_tools/syslog_logger_rb.html),它可以让你写入 syslogd,它会创建,在分布式设置中旋转你的文件。

    【讨论】:

      【解决方案5】:

      经过试验,我发现 Rails 初始化程序加载在正确的位置,您可以使用标准 Ruby File 类截断文件。我在 config/initializers/truncate_logs_on_server_start.rb 中有这个

      if MyRailsApp::Application.config.truncate_logs_on_server_start
        # Making an assumption here that we're logging to a file...
        File.open("log/#{ENV["RAILS_ENV"]}.log", "w") do |log_file|
          log_file.puts("Initializer truncate_logs_on_server_start reset the log file")
          log_file.puts
        end
      end
      

      你只需要在application.rb和各种环境中设置MyRailsApp::Application.config.truncate_logs_on_server_start

      【讨论】:

        最近更新 更多