Rails 3.2.x:如何在不重新启动应用程序的情况下更改日志记录级别

时间:2013-01-29 19:05:56

标签: ruby-on-rails-3 logging

我想在不重新启动应用程序的情况下更改正在运行的Rails 3.2.x应用程序的日志记录级别。我的目的是使用它来进行短时调试和信息收集,然后再将其恢复到通常的日志记录级别。

我也理解升级的级别是调试,信息,警告,错误和致命,生产服务器记录信息和更高,而开发日志调试和更高。

我明白如果我跑

Rails.logger.level=:debug #or :info, :warn, :error, :fatal

这会立即改变日志记录级别吗?

如果是这样,我是否可以通过编写Rake任务来调整日志记录级别,或者是否需要通过添加路由来支持此操作?例如在config / routes.rb中:

match "/set_logging_level/:level/:secret" => "logcontroller#setlevel" 

然后在logcontroller中设置级别。 (:level是日志记录级别,并且:客户端和服务器之间共享的秘密,可以防止随机用户调整日志级别)

哪个更合适,rake task或/ set_logging_level?

6 个答案:

答案 0 :(得分:11)

为什么不使用操作系统信号呢?例如,在UNIX上,user1和user2信号可以免费用于您的应用程序:

config/initializers/signals.rb:

trap('USR1') do
  Rails.logger.level = Logger::DEBUG
end

trap('USR2') do
  Rails.logger.level = Logger::WARN
end

然后就这样做:

kill -SIGUSR1 pid
kill -SIGUSR2 pid

请确保您不要覆盖服务器的信号 - 每个服务器都会利用各种信号来记录日志轮换,子进程终止和终止等等。

答案 1 :(得分:4)

在你的控制器LogController中试试这个

def setlevel
  begin
      Rails.logger.level = Logger.const_get(params[:level].upcase)
  rescue
      logger.info("Logging level #{params[:level]} not supported")
  end
end

答案 2 :(得分:4)

由于您必须更改正在运行 rails实例中的级别,因此简单的rake任务将无效。
我会选择专用路线。

而不是共享密钥我会使用应用程序的标准用户身份验证(如果您的应用有用户)并限制访问管理员/超级用户。

答案 3 :(得分:3)

您还可以使用gdb附加到正在运行的进程,将Rails.logger设置为调试级别,然后分离。我为我的美洲狮过程创建了以下1个衬垫:

gdb attach $(pidof puma) -ex 'call(rb_eval_string("Rails.logger.level = Logger::DEBUG"))' -ex detach -ex quit

注意:pidof将按降序返回多个pid。因此,如果您有多个具有相同名称的进程,则只会在pidof返回的第一个进程上运行。 “gdb attach”命令将丢弃其他命令,并显示以下消息:“忽略过多的命令行参数。(26762)”。但是,如果您只关心pidof返回的第一个进程,则可以放心地忽略它。

答案 4 :(得分:3)

在Rails控制台中,您只需执行以下操作即可:

Rails.logger.level = :debug

现在所有执行的代码都将以此日志级别运行

答案 5 :(得分:1)

使用rufus-scheduler,我创建了这个时间表:

scheduler.every 1.second do
  file_path = "#{Rails.root}/tmp/change_log_level.#{Process.pid}"
  if File.exists? file_path
    log_level = File.open(file_path).read.strip
    case log_level
    when "INFO"
      Rails.logger.level = Logger::INFO
      Rails.logger.info "Changed log_level to INFO"
    when "DEBUG"
      Rails.logger.level = Logger::DEBUG
      Rails.logger.info "Changed log_level to DEBUG"
    end
    File.delete file_path
  end
end

然后,可以通过在tmp/change_log_level.PID下创建文件来更改日志级别,其中pid是rails进程的进程ID。您可以创建rake / capistrano任务来检测和创建这些文件,从而可以快速切换正在运行的生产服务器的日志级别。

只要记住在工作线程中启动rufus,如果你使用的是独角兽或类似的东西。