You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

以守护进程模式(-d参数)运行Puma时,stdout_redirect指定路径无法生成日志的问题求助

解决Puma守护进程模式下stdout_redirect无法写入日志的问题

我之前部署Rails应用时也碰到过一模一样的问题!折腾了好一会儿才找到几个能保留stdout_redirect配置的可行方案,分享给你:

1. 先排查日志目录的权限问题

这是最常见的诱因——Puma运行的系统用户(比如部署用的deploy或rails用户)没有权限写入你指定的日志路径。

  • 先检查目录的所有者和权限:
    ls -ld /path/to/your/log/directory
    
  • 如果权限不对,修改目录所有者(假设运行用户是rails):
    chown -R rails:rails /path/to/your/log/directory
    
  • 或者直接调整目录权限,让运行用户拥有读写权:
    chmod 755 /path/to/your/log/directory
    

2. 调整Puma配置顺序,避免命令行-daemonize参数冲突

当你用命令行-d参数开启守护进程时,Puma会先执行守护进程化操作,再处理stdout_redirect配置,这会导致重定向失效。解决办法是在配置文件里显式设置daemonize true,并把stdout_redirect放在它前面,启动时不再加-d参数。

修改config/puma.rb:

# 先配置日志重定向
stdout_redirect '/var/log/your_app/puma.stdout.log', '/var/log/your_app/puma.stderr.log', true
# 再开启守护进程模式
daemonize true

# 其他Puma配置
port 3000
workers 2
# ...

然后启动Puma:

bundle exec puma -C config/puma.rb

3. 升级Puma到最新稳定版

某些旧版本的Puma(比如2.x或3.x早期版本)在守护进程模式下的stdout_redirect存在bug,升级到最新稳定版就能解决:

bundle update puma

验证解决方案是否生效

启动Puma后,可以通过以下方式确认日志是否正常写入:

  • 查看日志文件是否生成:ls /path/to/your/log/directory
  • 实时监控日志输出:tail -f /var/log/your_app/puma.stdout.log
  • 检查Puma进程状态:ps aux | grep puma,确认进程正常运行

内容的提问来源于stack exchange,提问作者rubyWorker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:22:48