Puma在运行守护进程时无法记录日志

3
当将 Puma 作为守护进程运行时(即使用-d标志),Puma似乎不会记录到stdout_redirect指定的位置。
是否有人之前遇到过这种情况,如果有的话,是否找到解决方法以生成适用于 Puma 的正确日志文件(特别是放置了stdout_redirect,并且特别是针对 Ruby on Rails 应用程序)?
1个回答

3

stdout_redirect 不能正常工作的原因是当你运行 rails server -d 时,config/puma.rb 没有被执行。你可以通过更改端口号或在文件中引入语法错误来证明这一点。

Puma 作为一个 Rack 服务器运行,因此由 Rack 中间件启动。 Rack 代码 只使用 Ruby 核心库中的 Process 类将进程分离:

def daemonize_app
  Process.daemon
end

不幸的是,Process.daemon 默认会执行两个操作:

  1. 将当前工作目录更改为根目录('/')。
  2. 将stdout和stderr重定向到/dev/null

因此,在Puma服务器初始化时,所有进程输出都被丢弃,由于/config/puma.rb不存在,因此Puma会回退到其硬编码的默认设置。

如果您暂时修改rack代码以覆盖chdir行为,您实际上可以演示所需的行为:

def daemonize_app
  Process.daemon(true)
end

如果.daemon的第一个参数为true,它不会更改当前工作目录,因此config/puma.rb会被执行。
除了对Rack进行一些丑陋的猴子补丁之外,可能的解决方法是跳过-d选项并在config/puma.rb中自行创建。例如:
# ... rest of the puma config

return unless ENV['DAEMONIZE_PUMA'].present?

puts 'Running puma as a daemon...'
Process.daemon(true)

接下来:

% export DAEMONIZE_PUMA=true
% rails server
=> Booting Puma
=> Rails 6.1.4 application starting in development
=> Run `bin/rails server --help` for more startup options
Running puma as a daemon...
% tail log/puma.out
=== puma startup: 2021-07-17 10:03:37 +1200 ===

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接