class Logging::Appenders::File

This class provides an Appender that can write to a File.

Attributes

filename[R]

Returns the path to the logfile.

Public Class Methods

assert_valid_logfile( filename ) → true click to toggle source

Asserts that the given filename can be used as a log file by ensuring that if the file exists it is a regular file and it is writable. If the file does not exist, then the directory is checked to see if it is writable.

An ArgumentError is raised if any of these assertions fail.

# File lib/logging/appenders/file.rb, line 22
def self.assert_valid_logfile( fn )
  if ::File.exist?(fn)
    if !::File.file?(fn)
      raise ArgumentError, "#{fn} is not a regular file"
    elsif !::File.writable?(fn)
      raise ArgumentError, "#{fn} is not writeable"
    end
  elsif !::File.writable?(::File.dirname(fn))
    raise ArgumentError, "#{::File.dirname(fn)} is not writable"
  end
  true
end
new( name, :filename → 'file' ) click to toggle source
new( name, :filename => 'file', :truncate → true )
new( name, :filename => 'file', :layout → layout )

Creates a new File Appender that will use the given filename as the logging destination. If the file does not already exist it will be created. If the :truncate option is set to true then the file will be truncated before writing begins; otherwise, log messages will be appended to the file.

Calls superclass method Logging::Appenders::IO.new
# File lib/logging/appenders/file.rb, line 45
def initialize( name, opts = {} )
  @filename = opts.fetch(:filename, name)
  raise ArgumentError, 'no filename was given' if @filename.nil?

  @filename = ::File.expand_path(@filename).freeze
  self.class.assert_valid_logfile(@filename)

  self.encoding = opts.fetch(:encoding, self.encoding)

  io = open_file
  super(name, io, opts)

  truncate if opts.fetch(:truncate, false)
end

Public Instance Methods

reopen() click to toggle source

Reopen the connection to the underlying logging destination. If the connection is currently closed then it will be opened. If the connection is currently open then it will be closed and immediately opened.

Calls superclass method Logging::Appenders::IO#reopen
# File lib/logging/appenders/file.rb, line 66
def reopen
  @mutex.synchronize {
    if defined? @io && @io
      flush
      @io.close rescue nil
    end
    @io = open_file
  }
  super
  self
end

Protected Instance Methods

create_file() click to toggle source
# File lib/logging/appenders/file.rb, line 99
def create_file
  mode = ::File::WRONLY | ::File::APPEND | ::File::CREAT | ::File::EXCL
  ::File.open(filename, mode: mode, external_encoding: encoding)
rescue Errno::EEXIST
  open_file
end
open_file() click to toggle source
# File lib/logging/appenders/file.rb, line 92
def open_file
  mode = ::File::WRONLY | ::File::APPEND
  ::File.open(filename, mode: mode, external_encoding: encoding)
rescue Errno::ENOENT
  create_file
end
truncate() click to toggle source
# File lib/logging/appenders/file.rb, line 81
def truncate
  @mutex.synchronize {
    begin
      @io.flock(::File::LOCK_EX)
      @io.truncate(0)
    ensure
      @io.flock(::File::LOCK_UN)
    end
  }
end