如何在Rails中使用调度器清理日志?
解决Rails自定义日志清理Rake任务的NoMethodError问题
看起来你在尝试用自定义Rake任务结合调度器清理日志时踩了个小坑——那个NoMethodError的原因很明确:你的DailyAttendance模型里压根没定义clear_logs这个类方法,Rake任务调用它的时候自然找不到啦。
下面分两种情况给你梳理解决方案,先搞清楚你要清理的是哪种日志:
情况1:清理Rails系统默认日志
如果你的目标是清空log/目录下的development.log、production.log这类系统日志,其实不用自己写任务,Rails自带的rake log:clear就完全能搞定。要是想定时自动执行,推荐用whenever这个专门做定时任务的gem:
- 先在Gemfile里加一行:
gem 'whenever', require: false,然后跑bundle install - 生成定时任务配置文件:
wheneverize . - 打开
config/schedule.rb,添加你的定时规则,比如每天凌晨清空日志:every :day, at: '00:00' do rake 'log:clear' end - 最后把任务同步到系统的crontab里:
whenever --update-crontab
情况2:清理DailyAttendance相关的业务日志(数据库记录)
如果是要清理数据库里的考勤日志记录,那得先给DailyAttendance模型补上clear_logs类方法才行:
# app/models/daily_attendance.rb class DailyAttendance < ApplicationRecord def self.clear_logs # 这里写你的清理逻辑,比如删除30天前的旧记录 where('created_at < ?', 30.days.ago).destroy_all end end
另外注意下你的Rake文件路径:你写的是app/lib/task/schedular.rake,正确路径应该是lib/tasks/scheduler.rake(拼写是scheduler,而且要放在lib/tasks目录下,不是app/lib/task),路径不对的话Rake会找不到这个任务哦。
验证小技巧
在跑Rake任务之前,先去Rails控制台测试下方法能不能正常运行:
rails console > DailyAttendance.clear_logs
如果控制台能顺利执行,说明方法没问题,再跑bundle exec rake atte_task:clear_log就不会报错啦。
内容的提问来源于stack exchange,提问作者Santosh Kumbhar
相关产品推荐
相关产品推荐

