module Sidekiq::Logging

Public Class Methods

initialize_logger(log_target = STDOUT) click to toggle source
# File lib/sidekiq/logging.rb, line 52
def self.initialize_logger(log_target = STDOUT)
  oldlogger = defined?(@logger) ? @logger : nil
  @logger = Logger.new(log_target)
  @logger.level = Logger::INFO
  @logger.formatter = ENV['DYNO'] ? WithoutTimestamp.new : Pretty.new
  oldlogger.close if oldlogger && !$TESTING # don't want to close testing's STDOUT logging
  @logger
end
job_hash_context(job_hash) click to toggle source
# File lib/sidekiq/logging.rb, line 32
def self.job_hash_context(job_hash)
  # If we're using a wrapper class, like ActiveJob, use the "wrapped"
  # attribute to expose the underlying thing.
  klass = job_hash['wrapped'] || job_hash["class"]
  bid = job_hash['bid']
  "#{klass} JID-#{job_hash['jid']}#{" BID-#{bid}" if bid}"
end
logger() click to toggle source
# File lib/sidekiq/logging.rb, line 61
def self.logger
  defined?(@logger) ? @logger : initialize_logger
end
logger=(log) click to toggle source
# File lib/sidekiq/logging.rb, line 65
def self.logger=(log)
  @logger = (log ? log : Logger.new(File::NULL))
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/sidekiq/logging.rb, line 76
def self.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
rescue RuntimeError => ex
  # RuntimeError: ObjectSpace is disabled; each_object will only work with Class, pass -X+O to enable
  puts "Unable to reopen logs: #{ex.message}"
end
tid() click to toggle source
# File lib/sidekiq/logging.rb, line 28
def self.tid
  Thread.current['sidekiq_tid'] ||= (Thread.current.object_id ^ ::Process.pid).to_s(36)
end
with_context(msg) { || ... } click to toggle source
# File lib/sidekiq/logging.rb, line 44
def self.with_context(msg)
  Thread.current[:sidekiq_context] ||= []
  Thread.current[:sidekiq_context] << msg
  yield
ensure
  Thread.current[:sidekiq_context].pop
end
with_job_hash_context(job_hash, &block) click to toggle source
# File lib/sidekiq/logging.rb, line 40
def self.with_job_hash_context(job_hash, &block)
  with_context(job_hash_context(job_hash), &block)
end

Public Instance Methods

logger() click to toggle source
# File lib/sidekiq/logging.rb, line 117
def logger
  Sidekiq::Logging.logger
end