Class: Logging::Appenders::File

Inherits:
IO show all
Defined in:
lib/logging/appenders/file.rb

Overview

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

Constant Summary

Constants included from Buffering

Buffering::DEFAULT_BUFFER_SIZE

Instance Attribute Summary collapse

Attributes inherited from IO

#close_method

Attributes included from Buffering

#async, #auto_flushing, #buffer, #flush_period, #write_size

Attributes inherited from Logging::Appender

#encoding, #filters, #layout, #level, #name

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from IO

#close

Methods included from Buffering

#clear!, #close, #flush, #flush_period?, #immediate_at=

Methods inherited from Logging::Appender

#<<, #_to_s, #add_filters, #allow, #append, #close, #closed?, #flush, #off?, #to_s

Constructor Details

#initialize(name, opts = {}) ⇒ File

call-seq:

File.new( name, :filename => 'file' )
File.new( name, :filename => 'file', :truncate => true )
File.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.

Raises:

  • (ArgumentError)

45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 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

Instance Attribute Details

#filenameObject (readonly)

Returns the path to the logfile.


61
62
63
# File 'lib/logging/appenders/file.rb', line 61

def filename
  @filename
end

Class Method Details

.assert_valid_logfile(fn) ⇒ Object

call-seq:

File.assert_valid_logfile( filename )    => true

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.


22
23
24
25
26
27
28
29
30
31
32
33
# 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

Instance Method Details

#reopenObject

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.


66
67
68
69
70
71
72
73
74
75
76
# 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