]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/commitdiff
logger: fix STDERR recursion
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Wed, 2 Jun 2021 18:57:21 +0000 (20:57 +0200)
committerMatthias Hecker <36882671+mattzque@users.noreply.github.com>
Sat, 5 Jun 2021 16:06:45 +0000 (18:06 +0200)
Overriding (as we should do) the standard error write method when
daemonizing introduces a recursion in the logger, due to the
persistent presence of the console logger.

The solution is obviously to stop logging on console
after daemonization.

lib/rbot/ircbot.rb
lib/rbot/logger.rb

index 91586c6a257054ca2059cd5e91a3cd735caf3be6..817acd71f537438c267c4860c6b918bbfa43b617 100644 (file)
@@ -431,7 +431,10 @@ class Bot
     LoggerManager.instance.set_logfile(@logfile, @config['log.keep'], @config['log.max_size'])
 
     if $daemonize
-      log "Redirecting standard input/output/error"
+      log "Redirecting standard input/output/error, console logger disabled"
+      LoggerManager.instance.flush
+      LoggerManager.instance.disable_console_logger
+
       [$stdin, $stdout, $stderr].each do |fd|
         begin
           fd.reopen "/dev/null"
index fd6d485fea3675b144a63e750f3c0ea7adefe713..d4717aa68135f8efc4104d2071d87e95a11cf270 100644 (file)
@@ -14,12 +14,22 @@ class Bot
   class LoggerManager
     include Singleton
 
+    def enable_console_logger
+      @console_logger = Logger.new(STDERR)
+      @console_logger.datetime_format = @dateformat
+      @console_logger.level = Logger::Severity::DEBUG
+    end
+
+    def disable_console_logger
+      @console_logger.close if @console_logger
+      @console_logger = nil
+    end
+
     def initialize
       @dateformat = "%Y/%m/%d %H:%M:%S"
 
-      @logger = Logger.new(STDERR)
-      @logger.datetime_format = @dateformat
-      @logger.level = Logger::Severity::DEBUG
+      enable_console_logger
+
       @file_logger = nil
 
       @queue = Queue.new
@@ -27,26 +37,26 @@ class Bot
     end
 
     def set_logfile(filename, keep, max_size)
+      # close previous file logger if present
+      @file_logger.close if @file_logger
+
       @file_logger = Logger.new(filename, keep, max_size*1024*1024)
       @file_logger.datetime_format = @dateformat
-      @file_logger.level = @logger.level
+      @file_logger.level = @console_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)
-      @logger.level = level
-      if @file_logger
-        @file_logger.level = level
-      end
+      @console_logger.level = level if @console_logger
+      @file_logger.level = level if @file_logger
     end
 
     def sync_log(severity, message = nil, progname = nil)
-      @logger.add(severity, message, progname)
-      if @file_logger
-        @file_logger.add(severity, message, progname)
-      end
+      @console_logger.add(severity, message, progname) if @console_logger
+      @file_logger.add(severity, message, progname) if @file_logger
     end
 
     def async_log(severity, message=nil, who_pos=1)