【问题标题】:Puma not logging when running daemon运行守护进程时 Puma 不记录
【发布时间】:2021-07-17 06:08:52
【问题描述】:

当 Puma 作为守护进程运行时(即使用 -d 标志),Puma 似乎没有登录到 stdout_redirect 指定的位置。

之前有没有人看到过这种行为,如果有,是否找到了一种解决方法来为 Puma 生成正确的日志文件(特别是使用 stdout_redirect,特别是对于 Ruby on Rails 应用程序)?

【问题讨论】:

    标签: ruby-on-rails logging puma puma-dev


    【解决方案1】:

    stdout_redirect 不起作用的原因是,当您运行 rails server -d 时,config/puma.rb 永远不会运行。您可以通过更改端口号甚至在文件中引入语法错误来证明这一点。

    Puma 作为 Rack 服务器运行,因此由 Rack 中间件启动。 Rack code 只是使用核心 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 ===
    

    【讨论】:

      猜你喜欢
      • 2019-11-17
      • 2015-02-03
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      相关资源
      最近更新 更多