Whenever Gem: I Set :Output But the Logfile Doesn't Show Up Where I'D Expect It To

whenever gem: I set :output but the logfile doesn't show up where I'd expect it to

Where is your log?

You're putting the output file at the highest directory level:

$ cd /log

To see if the file exists and if it has data in it:

$ ls -la cron_log.log

To create the log file if needed:

$ touch cron_log.log

To open up permissions for your own local debugging (do NOT do this in production!)

$ chmod +rw cron_log.log  

Is your command running?

To run the command manually to find out if it works as you expect:

$ /bin/bash -l -c 'echo "hello" >> /log/cron_log.log 2>&1'

To improve your security and protect your path, use full paths:

wrong: command 'echo "hello"'
right: command '/bin/echo "hello"'

To find the command full path:

$ which echo

To verify the cron is running as you expect:

$ sudo grep CRON /var/log/syslog

The grep result should have lines that something like this:

Jan 1 12:00:00 example.com CRON[123]: (root) CMD (... your command here ...)

Are you on a Mac?

If you're not seeing output in the syslog, and you're on a Mac, you may want to read about the Mac OSX switching from cron to launchd.

See the cron plist (/System/Library/LaunchDaemons/com.vix.cron.plist) and use a stdout/stderr path to debug cron itself. I don't recall if launchctl unloading and launchctl loading the plist is sufficient, or since it's a system daemon if you'd have to restart entirely. (see where is the cron log file in lion)

How to log relative to Rails?

To put the log relative to a Rails app, omit the leading slash (and typically call it cron.log)

set :output, "log/cron.log"

To put the log in a specific fully-qualified directory:

set :output, '/abc/def/ghi/log/cron.log'

The Whenever wiki has some good examples about redirecting output:

https://github.com/javan/whenever/wiki/Output-redirection-aka-logging-your-cron-jobs

Examples:

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

How can I have ruby logger log output to stdout as well as file?

You can write a pseudo IO class that will write to multiple IO objects. Something like:

class MultiIO
def initialize(*targets)
@targets = targets
end

def write(*args)
@targets.each {|t| t.write(*args)}
end

def close
@targets.each(&:close)
end
end

Then set that as your log file:

log_file = File.open("log/debug.log", "a")
Logger.new MultiIO.new(STDOUT, log_file)

Every time Logger calls puts on your MultiIO object, it will write to both STDOUT and your log file.

Edit: I went ahead and figured out the rest of the interface. A log device must respond to write and close (not puts). As long as MultiIO responds to those and proxies them to the real IO objects, this should work.

Ruby - share logger instance among module/classes

With the design you've laid out, it looks like the easiest solution is to give Crawler a module method that returns a module ivar.

module Crawler
def self.logger
@logger
end
def self.logger=(logger)
@logger = logger
end
end

Or you could use "class <<self magic" if you wanted:

module Crawler
class <<self
attr_accessor :logger
end
end

It does the exact same thing.

How can I disable logging in Ruby on Rails on a per-action basis?

The answer turns out to be a lot harder than I expected, since rails really does provide no hook to do this. Instead, you need to wrap some of the guts of ActionController::Base. In the common base class for my controllers, I do

def silent?(action)
false
end

# this knows more than I'd like about the internals of process, but
# the other options require knowing even more. It would have been
# nice to be able to use logger.silence, but there isn't a good
# method to hook that around, due to the way benchmarking logs.

def log_processing_with_silence_logs
if logger && silent?(action_name) then
@old_logger_level, logger.level = logger.level, Logger::ERROR
end

log_processing_without_silence_logs
end

def process_with_silence_logs(request, response, method = :perform_action, *arguments)
ret = process_without_silence_logs(request, response, method, *arguments)
if logger && silent?(action_name) then
logger.level = @old_logger_level
end
ret
end

alias_method_chain :log_processing, :silence_logs
alias_method_chain :process, :silence_logs

then, in the controller with the method I want to suppress logging on:

def silent?(action)
RAILS_ENV == "development" && ['my_noisy_action'].include?(action)
end

unable to install pg gem

Answered here:
Can't install pg gem on Windows

There is no Windows native version of
latest release of pg (0.10.0) released
yesterday, but if you install 0.9.0 it
should install binaries without
issues.



Related Topics



Leave a reply



Submit