Forum: Ruby wrapper around cronolog using pipes

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Hemant K. (Guest)
on 2007-01-11 08:24
(Received via mailing list)
require "thread"
require "open4"

path_to_cron = `which cronolog`
path_to_cron = path_to_cron.chomp

DELAY_TEMPLATES = { :daily => {:cmd_string => "#{path_to_cron}
",:format_string => "\%Y/\%m/\%d"},
  :hourly => {:cmd_string => "#{path_to_cron} --delay '1 hour'
",:format_string => nil},
  :midnight => {:cmd_string => "#{path_to_cron} --delay '12 hours'
",:format_string => nil}}

class Log4u

  def initialize(_file_name,delay_interval = :daily)

    raise(ArgumentError.new,"Invalid arguments") unless
[:daily,:hourly,:midnight].include? delay_interval

    @mutex = Mutex.new

    filename_string = File.basename(_file_name)
    dirname_string = File.dirname(_file_name)

    if (format_string = DELAY_TEMPLATES[delay_interval][:format_string])
      option_string =
"#{dirname_string}/#{format_string}/#{filename_string}"
    else
      option_string = "#{dirname_string}/#{filename_string}"
    end

    check_for_prgrm dirname_string

    cmd_string = DELAY_TEMPLATES[delay_interval][:cmd_string]
    pid,@log_pipe,stdout,stderr = Open4.popen4("#{cmd_string}
#{option_string}")
  end

  def check_for_prgrm dirname_string
    path_to_cron = `which cronolog`
    raise "Cronolog doesn't exist in path" if path_to_cron.empty?
    raise "Log Directory isn't writable" unless File.writable?
dirname_string
  end

  def time_string
    time_now = Time.now
    time_now.strftime("%I:%M%p")
  end

  def error msg
    @mutex.synchronize{ @log_pipe.puts "ERROR: #{time_string}: #{msg}" }
  end

  def info msg
    @mutex.synchronize{ @log_pipe.puts "INFO: #{time_string}: #{msg}" }
  end

  def debug msg
    @mutex.synchronize { @log_pipe.puts "DEBUG: #{time_string}: #{msg}"}
  end

  def close_log
    @mutex.synchronize { @log_pipe.close }
  end
end

I am facing following problems with above code:

  1. Doesn't detect the pipe errors and propagate it to parent ,
     and when used from threads would invariably lead to buggy code.
because threads won't
     detect the exception until abort_on_exception is true or a join is
performed.
     May be a problem of the author who is going to use it, but still if
i can simpify things a bit.
  2. Not sure, how it behaves when multiple processes/threads attempt to
get cronolog on
     the same file. In my tests cronolog seems to handle it, but not
entirely sure.
  3. Gives bloody zombie processes sometimes.


Any ideas folks?
This topic is locked and can not be replied to.