Sha256: 177ee89de2689646c1b2816a3b0179d56875b7ba97675eb5494261e39d675e4b

Contents?: true

Size: 1.36 KB

Versions: 6

Compression:

Stored size: 1.36 KB

Contents

require 'fcntl'

module Unicorn
  class Util
    class << self

      APPEND_FLAGS = File::WRONLY | File::APPEND

      # this reopens logs that have been rotated (using logrotate(8) or
      # similar).  It is recommended that you install
      # A +File+ object is considered for reopening if it is:
      #   1) opened with the O_APPEND and O_WRONLY flags
      #   2) opened with an absolute path (starts with "/")
      #   3) the current open file handle does not match its original open path
      #   4) unbuffered (as far as userspace buffering goes)
      # Returns the number of files reopened
      def reopen_logs
        nr = 0
        ObjectSpace.each_object(File) do |fp|
          next if fp.closed?
          next unless (fp.sync && fp.path[0..0] == "/")
          next unless (fp.fcntl(Fcntl::F_GETFL) & APPEND_FLAGS) == APPEND_FLAGS

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

          open_arg = 'a'
          if fp.respond_to?(:external_encoding) && enc = fp.external_encoding
            open_arg << ":#{enc.to_s}"
            enc = fp.internal_encoding and open_arg << ":#{enc.to_s}"
          end
          fp.reopen(fp.path, open_arg)
          fp.sync = true
          nr += 1
        end # each_object
        nr
      end

    end

  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
unicorn-0.8.2 lib/unicorn/util.rb
unicorn-0.9.0 lib/unicorn/util.rb
unicorn-0.9.1 lib/unicorn/util.rb
unicorn-0.7.1 lib/unicorn/util.rb
unicorn-0.8.1 lib/unicorn/util.rb
unicorn-0.8.0 lib/unicorn/util.rb