Class: Lumberjack::Device::RollingLogFile

Inherits:
LogFile show all
Defined in:
lib/lumberjack/device/rolling_log_file.rb

Overview

This is an abstract class for a device that appends entries to a file and periodically archives the existing file and starts a one. Subclasses must implement the roll_file? and archive_file_suffix methods.

The :keep option can be used to specify a maximum number of rolled log files to keep. Older files will be deleted based on the time they were created. The default is to keep all files.

The :min_roll_check option can be used to specify the number of seconds between checking the file to determine if it needs to be rolled. The default is to check at most once per second.

Direct Known Subclasses

DateRollingLogFile, SizeRollingLogFile

Constant Summary

Constants inherited from LogFile

LogFile::EXTERNAL_ENCODING

Constants inherited from Writer

Writer::DEFAULT_ADDITIONAL_LINES_TEMPLATE, Writer::DEFAULT_FIRST_LINE_TEMPLATE

Instance Attribute Summary collapse

Attributes inherited from Writer

#buffer_size

Instance Method Summary collapse

Methods inherited from LogFile

#reopen

Methods inherited from Writer

#close, #datetime_format, #datetime_format=, #flush, #write

Methods inherited from Lumberjack::Device

#cleanup_files!, #close, #datetime_format, #datetime_format=, #do_once, #flush, #reopen, #write

Constructor Details

#initialize(path, options = {}) ⇒ RollingLogFile

Returns a new instance of RollingLogFile.



18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/lumberjack/device/rolling_log_file.rb', line 18

def initialize(path, options = {})
  @path = File.expand_path(path)
  @keep = options[:keep]
  super(path, options)
  @file_inode = begin
    stream.lstat.ino
  rescue
    nil
  end
  @@rolls = []
  @next_stat_check = Time.now.to_f
  @min_roll_check = (options[:min_roll_check] || 1.0).to_f
end

Instance Attribute Details

#keepObject

Returns the value of attribute keep.



16
17
18
# File 'lib/lumberjack/device/rolling_log_file.rb', line 16

def keep
  @keep
end

#pathObject (readonly)

Returns the value of attribute path.



15
16
17
# File 'lib/lumberjack/device/rolling_log_file.rb', line 15

def path
  @path
end

Instance Method Details

#archive_file_suffixObject

Returns a suffix that will be appended to the file name when it is archived.. The suffix should change after it is time to roll the file. The log file will be renamed when it is rolled.

Raises:

  • (NotImplementedError)


34
35
36
# File 'lib/lumberjack/device/rolling_log_file.rb', line 34

def archive_file_suffix
  raise NotImplementedError
end

#roll_file!Object

Roll the log file by renaming it to the archive file name and then re-opening a stream to the log file path. Rolling a file is safe in multi-threaded or multi-process environments.



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/lumberjack/device/rolling_log_file.rb', line 45

def roll_file! # :nodoc:
  do_once(stream) do
    archive_file = "#{path}.#{archive_file_suffix}"
    stream.flush
    current_inode = begin
      File.stat(path).ino
    rescue
      nil
    end
    if @file_inode && current_inode == @file_inode && !File.exist?(archive_file) && File.exist?(path)
      begin
        File.rename(path, archive_file)
        after_roll
        cleanup_files!
      rescue SystemCallError
        # Ignore rename errors since it indicates the file was already rolled
      end
    end
    reopen_file
  end
rescue => e
  $stderr.write("Failed to roll file #{path}: #{e.inspect}\n#{e.backtrace.join("\n")}\n")
end

#roll_file?Boolean

Return true if the file should be rolled.

Returns:

  • (Boolean)

Raises:

  • (NotImplementedError)


39
40
41
# File 'lib/lumberjack/device/rolling_log_file.rb', line 39

def roll_file?
  raise NotImplementedError
end