module Toro::Logging

Public Class Methods

initialize_logger(log_target=nil) click to toggle source
# File lib/toro/logging.rb, line 10
def initialize_logger(log_target=nil)
  if log_target.nil?
    log_target = $TESTING ? '/dev/null' : STDOUT
  end

  old_logger = defined?(@logger) ? @logger : nil
  @logger = Logger.new(log_target)
  @logger.level = $TESTING ? Logger::DEBUG : Logger::INFO
  @logger.formatter = Formatter.new
  old_logger.close if old_logger && !$TESTING # don't want to close testing's STDOUT logging
  Celluloid.logger = @logger
  @logger
end
logger() click to toggle source
# File lib/toro/logging.rb, line 24
def logger
  defined?(@logger) ? @logger : initialize_logger
end
logger=(log) click to toggle source
# File lib/toro/logging.rb, line 28
def logger=(log)
  @logger = (log ? log : Logger.new('/dev/null'))
  Celluloid.logger = @logger
  @logger
end
reopen_logs() click to toggle source

This reopens ALL logfiles in the process that have been rotated using logrotate(8) (without copytruncate) or similar tools. A File object is considered for reopening if it is:

1) opened with the O_APPEND and O_WRONLY flags
2) the current open file handle does not match its original open path
3) unbuffered (as far as userspace buffering goes, not O_SYNC)

Returns the number of files reopened

# File lib/toro/logging.rb, line 41
def reopen_logs
  to_reopen = []
  append_flags = File::WRONLY | File::APPEND

  ObjectSpace.each_object(File) do |fp|
    begin
      if !fp.closed? && fp.stat.file? && fp.sync && (fp.fcntl(Fcntl::F_GETFL) & append_flags) == append_flags
        to_reopen << fp
      end
    rescue IOError, Errno::EBADF
    end
  end

  nr = 0
  to_reopen.each do |fp|
    orig_st = begin
      fp.stat
    rescue IOError, Errno::EBADF
      next
    end

    begin
      b = File.stat(fp.path)
      next if orig_st.ino == b.ino && orig_st.dev == b.dev
    rescue Errno::ENOENT
    end

    begin
      File.open(fp.path, 'a') { |tmpfp| fp.reopen(tmpfp) }
      fp.sync = true
      nr += 1
    rescue IOError, Errno::EBADF
      # not much we can do...
    end
  end
  nr
end