summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>2021-05-29 18:47:29 +0200
committerGiuseppe Bilotta <giuseppe.bilotta@gmail.com>2021-05-29 18:47:29 +0200
commit98446561cf3c7126dd93b34c9be361fa4aa8da36 (patch)
tree1d6030d5db6d5d40c0be9b07bdae4cf09031dd49
parent0368e8c09385a6c49e0d59cd6162675057e5b339 (diff)
fix: restart logger thread after fork
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).
-rwxr-xr-xbin/rbot14
-rw-r--r--lib/rbot/ircbot.rb9
-rw-r--r--lib/rbot/logger.rb14
3 files changed, 26 insertions, 11 deletions
diff --git a/bin/rbot b/bin/rbot
index 82ee9c9a..8c65f42c 100755
--- a/bin/rbot
+++ b/bin/rbot
@@ -111,14 +111,14 @@ if ($opts["help"])
exit 0
end
-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
diff --git a/lib/rbot/ircbot.rb b/lib/rbot/ircbot.rb
index ecb48449..4eac68d6 100644
--- a/lib/rbot/ircbot.rb
+++ b/lib/rbot/ircbot.rb
@@ -403,6 +403,8 @@ class Bot
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
@@ -421,8 +423,11 @@ class Bot
# 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
diff --git a/lib/rbot/logger.rb b/lib/rbot/logger.rb
index b5f615d7..fd6d485f 100644
--- a/lib/rbot/logger.rb
+++ b/lib/rbot/logger.rb
@@ -23,13 +23,16 @@ class Bot
@file_logger = nil
@queue = Queue.new
- @thread = start_thread
+ start_thread
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
end
def set_level(level)
@@ -90,10 +93,17 @@ class Bot
end
end
+ def flush
+ while @queue.size > 0
+ next
+ end
+ end
+
private
def start_thread
- Thread.new do
+ return if @thread and @thread.alive?
+ @thread = Thread.new do
lines = nil
while lines = @queue.pop
lines.each { |line|