Output redirection aka logging your cron jobs

Cheng Zheng edited this page Jul 31, 2016 · 6 revisions

In your schedule.rb file you can specify the redirection options for your commands at a global or command level by setting the 'output' variable.
This example is global level:

  # adds ">> /path/to/file.log 2>&1" to all commands
  set :output, '/path/to/file.log'

and you should put this global level set :output above your job definition, otherwise it wouldn't work
Example:

# This work
set :output, {:error => '~/Desktop/z.error.log', :standard => '~/Desktop/z.standard.log'}

every 1.minute do
  command "python ~/Desktop/whe/config/z.py"
end
every 1.minute do
  command "python ~/Desktop/whe/config/z.py"
end

# This won't work
set :output, {:error => '~/Desktop/z.error.log', :standard => '~/Desktop/z.standard.log'}


Rails.root and RAILS_ROOT will be unavailable, however Whenever.path (or just path) will deliver the Rails root path in most cases. Alternatively, if you want to access environment or application config values, simply add

# makes Rails.root as well as other environment specific Rails.application.config values available
require File.expand_path(File.dirname(__FILE__) + "/environment")

Or you can STDOUT and STDERR separately,

  # adds ">> cron.log 2> error.log" to all commands
  set :output, {:error => 'error.log', :standard => 'cron.log'}

  # adds ">> cron.log" to all commands
  set :output, {:standard => 'cron.log'}

  # adds "2> error.log" to all commands
  set :output, {:error => 'error.log'}

Additionally you can set these values at the command level,

  every 3.hours do
    runner "MyModel.some_process", :output => 'cron.log'     
    rake "my:rake:task", :output => {:error => 'error.log', :standard => 'cron.log'}
    command "/usr/bin/cmd"
  end  

If you need to pipe output into a command, e.g. syslog (logger), use a lambda:

set :output, lambda { "2>&1 | logger -t whenever_cron" }

In all cases you can if you explicitly set the value of any output to 'nil' it will add a redirect to /dev/null

  # adds ">> /dev/null 2>&1" to all commands
  set :output, nil
  set :output, {:error => nil, :standard => nil}

  # adds ">> /dev/null" to all commands
  set :output, {:standard => nil}

  # adds "2> /dev/null" to all commands
  set :output, {:error => nil}

NB: In Rails, the :output to get the files into the log directory is log/name_of_log.log (?)