diff --git a/README.md b/README.md index 2a61883..0df379b 100644 --- a/README.md +++ b/README.md @@ -130,6 +130,12 @@ serialized using JSON.generate Crono.perform(TestJob, 'some', 'args').every 1.day, at: {hour: 12, min: 15} ``` +You can set some options that not passed to the job but affect how the job will be treated by Crono. For example, you can set to truncate job logs (which stored in the database) to a certain number of records: + +```ruby +Crono.perform(TestJob).with_options(truncate_log: 100).every 1.week, on: :monday +``` + #### Run To run Crono, in your Rails project root directory: diff --git a/lib/crono/job.rb b/lib/crono/job.rb index cd9aa2d..bdd9b51 100644 --- a/lib/crono/job.rb +++ b/lib/crono/job.rb @@ -62,9 +62,15 @@ module Crono job_log.truncate(job_log.rewind) end + def truncate_log(log) + return log.lines.last(job_options[:truncate_log]).join if job_options[:truncate_log] + return log + end + def update_model saved_log = model.reload.log || '' log_to_save = saved_log + job_log.string + log_to_save = truncate_log(log_to_save) model.update(last_performed_at: last_performed_at, log: log_to_save, healthy: healthy) end @@ -99,7 +105,7 @@ module Crono def log(message, severity = Logger::INFO) @semaphore.synchronize do - logger.log severity, message + logger.log(severity, message) if logger job_logger.log severity, message end end diff --git a/spec/job_spec.rb b/spec/job_spec.rb index 3ab219a..7860fb0 100644 --- a/spec/job_spec.rb +++ b/spec/job_spec.rb @@ -107,13 +107,29 @@ describe Crono::Job do expect(@crono_job.healthy).to be true end - it 'should save and truncate job log' do + it 'should save log' do message = 'test message' job.send(:log, message) job.save expect(job.send(:model).reload.log).to include message expect(job.job_log.string).to be_empty end + + it 'should not truncate log if not specified' do + log = (1..100).map {|n| "line #{n}" }.join("\n") + job = Crono::Job.new(TestJob, period, []) + job.send(:log, log) + job.save + expect(job.send(:model).reload.log.lines.size).to be >= log.lines.size + end + + it 'should truncate log if specified' do + log = (1..100).map {|n| "line #{n}" }.join("\n") + job = Crono::Job.new(TestJob, period, [], truncate_log: 50) + job.send(:log, log) + job.save + expect(job.send(:model).reload.log.lines.size).to be 50 + end end describe '#load' do @@ -132,6 +148,7 @@ describe Crono::Job do describe '#log' do it 'should write log messages to both common and job log' do message = 'Test message' + job.logfile = "/dev/null" expect(job.logger).to receive(:log).with(Logger::INFO, message) expect(job.job_logger).to receive(:log).with(Logger::INFO, message) job.send(:log, message)