# File lib/rbot/core/irclog.rb, line 244
  def loggers_thread
    ls = nil
    debug 'loggers_thread starting'
    while ls = @queue.pop
      message, where = ls
      message = message.chomp
      now = Time.now
      stamp = now.strftime("%Y/%m/%d %H:%M:%S")
      if where.class <= Server
        where_str = "server"
      else
        where_str = where.downcase.gsub(/[:!?$*()\/\\<>|"']/, "_")
      end
      return unless can_log_on(where_str)

      # close the previous logfile if we're rotating
      if @logs.has_key? where_str
        fp = logfilepath(where_str, now)
        logfile_close(where_str, 'log rotation') if fp != @logs[where_str][1].path
      end

      # (re)open the logfile if necessary
      unless @logs.has_key? where_str
        if @logs.size > @bot.config['irclog.max_open_files']
          @logs.keys.sort do |a, b|
            @logs[a][0] <=> @logs[b][0]
          end.slice(0, @logs.size - @bot.config['irclog.max_open_files']).each do |w|
            logfile_close w, "idle since #{@logs[w][0]}"
          end
        end
        fp = logfilepath(where_str, now)
        begin
          dir = File.dirname(fp)
          # first of all, we check we're not trying to build a directory structure
          # where one of the components exists already as a file, so we
          # backtrack along dir until we come across the topmost existing name.
          # If it's a file, we rename to filename.old.filedate
          up = dir.dup
          until File.exist? up
            up.replace File.dirname up
          end
          unless File.directory? up
            backup = up.dup
            backup << ".old." << File.atime(up).strftime('%Y%m%d%H%M%S')
            debug "#{up} is not a directory! renaming to #{backup}"
            File.rename(up, backup)
          end
          FileUtils.mkdir_p(dir)
          # conversely, it may happen that fp exists and is a directory, in
          # which case we rename the directory instead
          if File.directory? fp
            backup = fp.dup
            backup << ".old." << File.atime(fp).strftime('%Y%m%d%H%M%S')
            debug "#{fp} is not a file! renaming to #{backup}"
            File.rename(fp, backup)
          end
          # it should be fine to create the file now
          f = File.new(fp, "a")
          f.sync = true
          f.puts "[#{stamp}] @ Log started by #{@bot.myself.nick}"
        rescue Exception => e
          error e
          next
        end
        @logs[where_str] = [now, f]
      end
      @logs[where_str][1].puts "[#{stamp}] #{message}"
      @logs[where_str][0] = now
      #debug "[#{stamp}] <#{where}> #{message}"
    end
    @logs.keys.each { |w| logfile_close(w, 'rescan or shutdown') }
    debug 'loggers_thread terminating'
  end