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

如何在Dokku部署的Rails应用中追踪Whenever日志?

在Dokku上让Whenever日志通过dokku logs查看的解决方法

我之前也碰到过一模一样的问题!折腾了好一会儿才搞明白关键所在——Dokku的日志系统是基于Docker的,它只会收集容器的标准输出(stdout)和标准错误(stderr),而Whenever默认可能会把日志写到自定义文件里,这就导致dokku logs抓不到这些内容。下面是我亲测有效的解决步骤:

1. 修改Whenever任务的日志输出目标

不管你用的是runner还是command类型的任务,都要把日志重定向到容器的stdout和stderr,而不是单独的日志文件。

对于Rails Runner任务

把原来指定日志文件的配置,改成指向系统的标准流:

every 1.hour do
  runner "MyModel.do_something", 
         output: { standard: '/proc/self/fd/1', error: '/proc/self/fd/2' }
end

这里/proc/self/fd/1对应标准输出,/proc/self/fd/2对应标准错误,这样任务的日志就会直接进入Dokku的日志收集管道。

对于Shell命令任务

直接在命令末尾加上重定向语句:

every 1.hour do
  command "bundle exec rake my:custom_task >> /proc/self/fd/1 2>> /proc/self/fd/2"
end

2. 确保Rails日志输出到标准流(可选但推荐)

如果你的Whenever任务用了Rails的日志系统(比如Rails.logger),默认生产环境下Rails可能会把日志写到文件里,这时候需要修改config/environments/production.rb的配置,让日志输出到stdout:

config.logger = ActiveSupport::Logger.new(STDOUT)
config.logger.formatter = config.log_formatter
config.log_level = :info # 可以根据需求调整日志级别

这样Rails应用本身的日志(包括Whenever任务里的日志)都会统一输出到标准流,方便Dokku收集。

3. 验证效果

部署更新后的代码到Dokku,然后执行:

dokku logs your-app-name -t

等待Whenever任务触发后,你就能在实时日志里看到任务的输出内容了!

另外要注意:不要在Dokku容器里写自定义路径的日志文件,因为容器是临时的,重启后文件会丢失,而且Dokku也不会主动收集这些文件里的日志内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:59:46