Logging was broken when daemonizing, due to the logger thread being dead
after the fork. This can be solved by restarting the thread, if necessary
when setting the log file (which we conveniently do right after the fork).
-if(bot = Irc::Bot.new(ARGV.shift, :argv => orig_opts))
- # setup logger based on command line arguments
- loglevel = $opts['loglevel'] ? $opts['loglevel'].to_i : nil
- loglevel = $opts['debug'] ? 0 : loglevel
- if loglevel
- Irc::Bot::LoggerManager.instance.set_level(loglevel)
- end
+# setup logger based on command line arguments
+loglevel = $opts['loglevel'] ? $opts['loglevel'].to_i : nil
+loglevel = $opts['debug'] ? 0 : loglevel
+if loglevel
+ Irc::Bot::LoggerManager.instance.set_level(loglevel)
+end
+if(bot = Irc::Bot.new(ARGV.shift, :argv => orig_opts))
# just run the bot
bot.mainloop
end
# just run the bot
bot.mainloop
end
debug "Using `#{@logfile}' as debug log"
end
debug "Using `#{@logfile}' as debug log"
end
+ LoggerManager.instance.flush
+
# See http://blog.humlab.umu.se/samuel/archives/000107.html
# for the backgrounding code
if $daemonize
# See http://blog.humlab.umu.se/samuel/archives/000107.html
# for the backgrounding code
if $daemonize
# File.umask 0000 # Ensure sensible umask. Adjust as needed.
end
# File.umask 0000 # Ensure sensible umask. Adjust as needed.
end
- # setup logger based on bot configuration
- LoggerManager.instance.set_level(@config['log.level'])
+ # setup logger based on bot configuration, if not set from the command line
+ loglevel_set = $opts.has_key?('debug') or $opts.has_key?('loglevel')
+ LoggerManager.instance.set_level(@config['log.level']) unless loglevel_set
+
+ # Set the logfile
LoggerManager.instance.set_logfile(@logfile, @config['log.keep'], @config['log.max_size'])
if $daemonize
LoggerManager.instance.set_logfile(@logfile, @config['log.keep'], @config['log.max_size'])
if $daemonize
@file_logger = nil
@queue = Queue.new
@file_logger = nil
@queue = Queue.new
end
def set_logfile(filename, keep, max_size)
@file_logger = Logger.new(filename, keep, max_size*1024*1024)
@file_logger.datetime_format = @dateformat
@file_logger.level = @logger.level
end
def set_logfile(filename, keep, max_size)
@file_logger = Logger.new(filename, keep, max_size*1024*1024)
@file_logger.datetime_format = @dateformat
@file_logger.level = @logger.level
+ # make sure the thread is running, which might be false after a fork
+ # (conveniently, we call set_logfile right after the fork)
+ start_thread
+ def flush
+ while @queue.size > 0
+ next
+ end
+ end
+
+ return if @thread and @thread.alive?
+ @thread = Thread.new do
lines = nil
while lines = @queue.pop
lines.each { |line|
lines = nil
while lines = @queue.pop
lines.each { |line|