10

我想在不重新启动应用程序的情况下更改正在运行的 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" 

然后在日志控制器中设置级别。(:level 是日志级别, :secret 在客户端和服务器之间共享,是为了防止随机用户调整日志级别)

rake task 还是 /set_logging_level 哪个更合适?

4

6 回答 6

14

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

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

只需确保您不覆盖服务器的信号 - 每个服务器都利用各种信号进行日志轮换、子进程终止和终止等操作。

于 2013-07-18T10:40:16.283 回答
7

在 Rails 控制台中,您可以简单地执行以下操作:

Rails.logger.level = :debug

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

于 2020-02-27T00:35:55.827 回答
4

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

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

于 2013-01-29T20:02:23.810 回答
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
于 2013-01-29T19:58:42.687 回答
3

您还可以使用 gdb 附加到正在运行的进程,将 Rails.logger 设置为调试级别,然后分离。我已经为我的 puma 流程创建了以下 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 返回的第一个进程,则可以放心地忽略它。

于 2015-03-08T22:27:29.340 回答
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 任务来检测和创建这些文件,从而允许您快速切换正在运行的生产服务器的日志级别。

如果您使用的是 unicorn 或类似的,请记住在工作线程中启动 rufus。

于 2013-10-15T11:34:53.683 回答