debugging messages from a daemon program

Discussion in 'Ruby' started by Will Parsons, Jul 31, 2009.

  1. Will Parsons

    Will Parsons Guest

    I'm developing a daemon written in Ruby and in the course of development I
    like to see various status messages printed at crucial points to aid in
    debugging. Since this is a daemon, I use syslog and create a global $log
    variable to handle log messages, essentially like the following:

    require 'syslog'
    ....
    $log = Syslog.open('progname', Syslog::LOG_PID, log_facility)
    ....
    $log.debug some_message

    This has worked well as long as the whole program is contained in a single
    file, but as the program has gradually increased in complexity, I wish to
    remove the definition of some classes to their own files and "require" them
    in the main ruby source file. This means that whatever is removed to a
    separate file no longer has access to the global variable $log. Any
    suggestions on how to best handle status/debug messages from these
    subsidiary files?

    --
    Will
     
    Will Parsons, Jul 31, 2009
    #1
    1. Advertising

  2. Will Parsons

    Ken Burgett Guest

    [Note: parts of this message were removed to make it a legal post.]

    I just did some development on a daemon, and I understand your pain.

    I had some luck using the ENV hash: ENV['logger'] = Logger.now(...)

    2009/7/31 Will Parsons <>

    > I'm developing a daemon written in Ruby and in the course of development I
    > like to see various status messages printed at crucial points to aid in
    > debugging. Since this is a daemon, I use syslog and create a global $log
    > variable to handle log messages, essentially like the following:
    >
    > require 'syslog'
    > ...
    > $log = Syslog.open('progname', Syslog::LOG_PID, log_facility)
    > ...
    > $log.debug some_message
    >
    > This has worked well as long as the whole program is contained in a single
    > file, but as the program has gradually increased in complexity, I wish to
    > remove the definition of some classes to their own files and "require" them
    > in the main ruby source file. This means that whatever is removed to a
    > separate file no longer has access to the global variable $log. Any
    > suggestions on how to best handle status/debug messages from these
    > subsidiary files?
    >
    > --
    > Will
    >
    >



    --
    Regards,

    Ken

    Seek wisdom through disbelief
     
    Ken Burgett, Jul 31, 2009
    #2
    1. Advertising

  3. Will Parsons wrote:
    > I wish
    > to
    > remove the definition of some classes to their own files and "require"
    > them
    > in the main ruby source file. This means that whatever is removed to a
    > separate file no longer has access to the global variable $log.


    Why? A global variable is global - it should be visible from any file.
    As long as your main program initialises $log before any of the
    subsidiary files try to use it, you should be fine.

    Are you saying you want to run these subsidiary files by themselves,
    independent from the main program which initialises $log?

    One way to do that is to initialise $log in a separate library.

    Note that the Syslog API is Syslog.debug, Syslog.warning etc. So you
    don't actually need to set up a global variable, but if you do, it
    should be set to Syslog (which is also the value returned by
    Syslog.open)

    ---- mylog.rb ----
    require "syslog"
    Syslog.open('progname', Syslog::LOG_PID, Syslog::LOG_DAEMON)
    $log = Syslog

    ---- main.rb -----
    require "mylog"
    require "subsid"
    $log.warning "Starting"

    ---- subsid.rb ----
    require "mylog"
    $log.warning "Loading library"

    An advantage of setting $log is that you can point it to a different
    object with a duck-type interface. Logger has a similar interface,
    although annoyingly it's Logger#warn vs Syslog.warning

    A more sophisticated approach to setting up shared objects like loggers
    is to use dependency injection. See if you can find a copy of Jim
    Weirich's depinj.rb, which unfortunately is no longer available at
    http://onestepback.org/index.cgi/Tech/Ruby/DependencyInjectionInRuby.rdoc
    --
    Posted via http://www.ruby-forum.com/.
     
    Brian Candler, Aug 1, 2009
    #3
  4. Ken Burgett wrote:
    > I had some luck using the ENV hash: ENV['logger'] = Logger.now(...)


    The ENV hash is the OS environment. It's only supposed to contain
    strings.

    You can make another global hash of objects if you like:

    SERVICES = {}
    SERVICES['logger'] = Logger.new(...)

    But that's not much different to using global variables.
    --
    Posted via http://www.ruby-forum.com/.
     
    Brian Candler, Aug 1, 2009
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Fatih
    Replies:
    4
    Views:
    14,003
    Fatih
    Apr 9, 2004
  2. Jean-Paul Calderone
    Replies:
    0
    Views:
    479
    Jean-Paul Calderone
    Mar 20, 2009
  3. Floris Bruynooghe
    Replies:
    1
    Views:
    472
    Floris Bruynooghe
    Mar 24, 2009
  4. Grischa Schuering
    Replies:
    1
    Views:
    560
    David Efflandt
    Sep 30, 2003
  5. Daemon Win32::Daemon;

    , Sep 7, 2006, in forum: Perl Misc
    Replies:
    0
    Views:
    274
Loading...

Share This Page