如何在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
相关产品推荐
相关产品推荐

