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

Jay*_*dse 7 logging ruby-on-rails-3

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

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

我明白,如果我跑

Rails.logger.level=:debug #or :info, :warn, :error, :fatal
Run Code Online (Sandbox Code Playgroud)

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

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

match "/set_logging_level/:level/:secret" => "logcontroller#setlevel" 
Run Code Online (Sandbox Code Playgroud)

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

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

lza*_*zap 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
Run Code Online (Sandbox Code Playgroud)

然后就这样做:

kill -SIGUSR1 pid
kill -SIGUSR2 pid
Run Code Online (Sandbox Code Playgroud)

只是确保你不要覆盖服务器的信号 - 每个服务器利用各种信号来记录日志轮换,子进程终止和终止等等.


axs*_*uul 8

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

Rails.logger.level = :debug
Run Code Online (Sandbox Code Playgroud)

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


kr1*_*kr1 4

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

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