From: Brian Candler Date: 2009-08-01T17:20:49+09:00 Subject: Re: debugging messages from a daemon program 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/.