lumberjack 1.0.9 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b07995cff9cade3e5246b7559cf25a34f0df5611
4
- data.tar.gz: de7054b468dfd8ea8cdbcf65b2bb1594e4299f10
3
+ metadata.gz: 9a62ab302df8141afb410a4c50c4caf6209ec5c5
4
+ data.tar.gz: 36e54fd44f8af8a3970a34f2dc3c3bfb011a6ff8
5
5
  SHA512:
6
- metadata.gz: b988d1886a98a118dab20bc4457ad6b210f72ee6640237235b12bd63d1c969b32eeae5db944ee04c731df3df29fefef6c0db634df1ee48e6b6a0ac33c10154ea
7
- data.tar.gz: 9391faa754aa454f0e3f9295cadbb81aa2b7336859fd063b212c7dc160988febe1792a4718b09536e6018246686e9ee7bffc053d0204d97bb792efc4cc513ebc
6
+ metadata.gz: 6ac3c76a1e33bab723ff97a9a667d36a630f07541571518786f175b01f0a3ee49ac0ace70ecadd3a7ecb8db38d109b7967aa7abf7e85b123d7cb73de505c6d93
7
+ data.tar.gz: 6f67110bc4ee430122fab313bdd730c5c079060a4430377bc8c68651b5292e4b0452e4dbf15415902c69775ca2a88aab35fc4eb4e6b06bad4871604ed18a8f0f
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -1,18 +1,18 @@
1
1
  require 'rbconfig'
2
2
  require 'time'
3
3
  require 'thread'
4
+ require 'securerandom'
4
5
 
5
6
  module Lumberjack
6
7
  LINE_SEPARATOR = (RbConfig::CONFIG['host_os'].match(/mswin/i) ? "\r\n" : "\n")
7
8
 
8
- load File.expand_path("../lumberjack/severity.rb", __FILE__)
9
- load File.expand_path("../lumberjack/log_entry.rb", __FILE__)
10
- load File.expand_path("../lumberjack/formatter.rb", __FILE__)
11
- load File.expand_path("../lumberjack/device.rb", __FILE__)
12
- load File.expand_path("../lumberjack/logger.rb", __FILE__)
13
- load File.expand_path("../lumberjack/template.rb", __FILE__)
14
-
15
- autoload :Rack, File.expand_path("../lumberjack/rack.rb", __FILE__)
9
+ require File.expand_path("../lumberjack/severity.rb", __FILE__)
10
+ require File.expand_path("../lumberjack/log_entry.rb", __FILE__)
11
+ require File.expand_path("../lumberjack/formatter.rb", __FILE__)
12
+ require File.expand_path("../lumberjack/device.rb", __FILE__)
13
+ require File.expand_path("../lumberjack/logger.rb", __FILE__)
14
+ require File.expand_path("../lumberjack/template.rb", __FILE__)
15
+ require File.expand_path("../lumberjack/rack.rb", __FILE__)
16
16
 
17
17
  class << self
18
18
  # Define a unit of work within a block. Within the block supplied to this
@@ -26,7 +26,7 @@ module Lumberjack
26
26
  # Lumberjack::Rack::UnitOfWork class.
27
27
  def unit_of_work(id = nil)
28
28
  save_val = Thread.current[:lumberjack_logger_unit_of_work_id]
29
- id ||= rand(0xFFFFFFFFFFFF).to_s(16).rjust(12, '0').upcase
29
+ id ||= SecureRandom.hex(6)
30
30
  Thread.current[:lumberjack_logger_unit_of_work_id] = id
31
31
  begin
32
32
  return yield
@@ -2,12 +2,12 @@ module Lumberjack
2
2
  # This is an abstract class for logging devices. Subclasses must implement the +write+ method and
3
3
  # may implement the +close+ and +flush+ methods if applicable.
4
4
  class Device
5
- load File.expand_path("../device/writer.rb", __FILE__)
6
- load File.expand_path("../device/log_file.rb", __FILE__)
7
- load File.expand_path("../device/rolling_log_file.rb", __FILE__)
8
- load File.expand_path("../device/date_rolling_log_file.rb", __FILE__)
9
- load File.expand_path("../device/size_rolling_log_file.rb", __FILE__)
10
- load File.expand_path("../device/null.rb", __FILE__)
5
+ require File.expand_path("../device/writer.rb", __FILE__)
6
+ require File.expand_path("../device/log_file.rb", __FILE__)
7
+ require File.expand_path("../device/rolling_log_file.rb", __FILE__)
8
+ require File.expand_path("../device/date_rolling_log_file.rb", __FILE__)
9
+ require File.expand_path("../device/size_rolling_log_file.rb", __FILE__)
10
+ require File.expand_path("../device/null.rb", __FILE__)
11
11
 
12
12
  # Subclasses must implement this method to write a LogEntry.
13
13
  def write(entry)
@@ -12,6 +12,7 @@ module Lumberjack
12
12
  # with the <tt>:roll</tt> option which may contain a value of <tt>:daily</tt>, <tt>:weekly</tt>,
13
13
  # or <tt>:monthly</tt>.
14
14
  def initialize(path, options = {})
15
+ @manual = options[:manual]
15
16
  @file_date = Date.today
16
17
  if options[:roll] && options[:roll].to_s.match(/(daily)|(weekly)|(monthly)/i)
17
18
  @roll_period = $~[0].downcase.to_sym
@@ -34,17 +35,21 @@ module Lumberjack
34
35
  end
35
36
 
36
37
  def roll_file?
37
- date = Date.today
38
- if date.year > @file_date.year
39
- true
40
- elsif @roll_period == :daily && date.yday > @file_date.yday
41
- true
42
- elsif @roll_period == :weekly && date.cweek > @file_date.cweek
43
- true
44
- elsif @roll_period == :monthly && date.month > @file_date.month
38
+ if @manual
45
39
  true
46
40
  else
47
- false
41
+ date = Date.today
42
+ if date.year > @file_date.year
43
+ true
44
+ elsif @roll_period == :daily && date.yday > @file_date.yday
45
+ true
46
+ elsif @roll_period == :weekly && date.cweek != @file_date.cweek
47
+ true
48
+ elsif @roll_period == :monthly && date.month > @file_date.month
49
+ true
50
+ else
51
+ false
52
+ end
48
53
  end
49
54
  end
50
55
 
@@ -4,6 +4,8 @@ module Lumberjack
4
4
  class Device
5
5
  # This is a logging device that appends log entries to a file.
6
6
  class LogFile < Writer
7
+ EXTERNAL_ENCODING = "ascii-8bit"
8
+
7
9
  # The absolute path of the file being logged to.
8
10
  attr_reader :path
9
11
 
@@ -11,7 +13,7 @@ module Lumberjack
11
13
  def initialize(path, options = {})
12
14
  @path = File.expand_path(path)
13
15
  FileUtils.mkdir_p(File.dirname(@path))
14
- super(File.new(@path, 'a', :encoding => "ascii-8bit"), options)
16
+ super(File.new(@path, 'a', :encoding => EXTERNAL_ENCODING), options)
15
17
  end
16
18
  end
17
19
  end
@@ -29,6 +29,28 @@ module Lumberjack
29
29
  raise NotImplementedError
30
30
  end
31
31
 
32
+ # Roll the log file by renaming it to the archive file name and then re-opening a stream to the log
33
+ # file path. Rolling a file is safe in multi-threaded or multi-process environments.
34
+ def roll_file! #:nodoc:
35
+ do_once(stream) do
36
+ archive_file = "#{path}.#{archive_file_suffix}"
37
+ stream.flush
38
+ current_inode = File.stat(path).ino rescue nil
39
+ if @file_inode && current_inode == @file_inode && !File.exist?(archive_file) && File.exist?(path)
40
+ begin
41
+ File.rename(path, archive_file)
42
+ after_roll
43
+ cleanup_files!
44
+ rescue SystemCallError
45
+ # Ignore rename errors since it indicates the file was already rolled
46
+ end
47
+ end
48
+ reopen_file
49
+ end
50
+ rescue => e
51
+ STDERR.write("Failed to roll file #{path}: #{e.inspect}\n#{e.backtrace.join("\n")}\n")
52
+ end
53
+
32
54
  protected
33
55
 
34
56
  # This method will be called after a file has been rolled. Subclasses can
@@ -46,38 +68,16 @@ module Lumberjack
46
68
  roll_file! if roll_file?
47
69
  end
48
70
  end
49
-
71
+
50
72
  private
51
73
 
52
74
  def reopen_file
53
75
  old_stream = stream
54
- self.stream = File.open(path, 'a')
76
+ self.stream = File.open(path, 'a', encoding: EXTERNAL_ENCODING)
55
77
  stream.sync = true
56
78
  @file_inode = stream.lstat.ino rescue nil
57
79
  old_stream.close
58
80
  end
59
-
60
- # Roll the log file by renaming it to the archive file name and then re-opening a stream to the log
61
- # file path. Rolling a file is safe in multi-threaded or multi-process environments.
62
- def roll_file! #:nodoc:
63
- do_once(stream) do
64
- archive_file = "#{path}.#{archive_file_suffix}"
65
- stream.flush
66
- current_inode = File.stat(path).ino rescue nil
67
- if @file_inode && current_inode == @file_inode && !File.exist?(archive_file) && File.exist?(path)
68
- begin
69
- File.rename(path, archive_file)
70
- after_roll
71
- cleanup_files!
72
- rescue SystemCallError
73
- # Ignore rename errors since it indicates the file was already rolled
74
- end
75
- end
76
- reopen_file
77
- end
78
- rescue => e
79
- STDERR.write("Failed to roll file #{path}: #{e.inspect}\n#{e.backtrace.join("\n")}\n")
80
- end
81
81
  end
82
82
 
83
83
  def cleanup_files!
@@ -10,6 +10,7 @@ module Lumberjack
10
10
  # Create an new log device to the specified file. The maximum size of the log file is specified with
11
11
  # the <tt>:max_size</tt> option. The unit can also be specified: "32K", "100M", "2G" are all valid.
12
12
  def initialize(path, options = {})
13
+ @manual = options[:manual]
13
14
  @max_size = options[:max_size]
14
15
  if @max_size.is_a?(String)
15
16
  if @max_size.match(/^(\d+(\.\d+)?)([KMG])?$/i)
@@ -37,8 +38,8 @@ module Lumberjack
37
38
  end
38
39
 
39
40
  def roll_file?
40
- stream.stat.size > @max_size
41
- rescue SystemCallError => e
41
+ @manual || stream.stat.size > @max_size
42
+ rescue SystemCallError
42
43
  false
43
44
  end
44
45
 
@@ -19,7 +19,7 @@ module Lumberjack
19
19
  end
20
20
 
21
21
  def <<(string)
22
- @values << string
22
+ @values << string.encode("UTF-8".freeze, invalid: :replace, undef: :replace)
23
23
  @size += string.size
24
24
  end
25
25
 
@@ -8,10 +8,10 @@ module Lumberjack
8
8
  # By default, all object will be converted to strings using their inspect method except for Strings
9
9
  # and Exceptions. Strings are not converted and Exceptions are converted using the ExceptionFormatter.
10
10
  class Formatter
11
- load File.expand_path("../formatter/exception_formatter.rb", __FILE__)
12
- load File.expand_path("../formatter/inspect_formatter.rb", __FILE__)
13
- load File.expand_path("../formatter/pretty_print_formatter.rb", __FILE__)
14
- load File.expand_path("../formatter/string_formatter.rb", __FILE__)
11
+ require File.expand_path("../formatter/exception_formatter.rb", __FILE__)
12
+ require File.expand_path("../formatter/inspect_formatter.rb", __FILE__)
13
+ require File.expand_path("../formatter/pretty_print_formatter.rb", __FILE__)
14
+ require File.expand_path("../formatter/string_formatter.rb", __FILE__)
15
15
 
16
16
  def initialize
17
17
  @class_formatters = {}
@@ -1,5 +1,5 @@
1
1
  module Lumberjack
2
2
  module Rack
3
- autoload :UnitOfWork, File.expand_path("../rack/unit_of_work.rb", __FILE__)
3
+ require File.expand_path("../rack/unit_of_work.rb", __FILE__)
4
4
  end
5
5
  end
@@ -13,53 +13,56 @@ describe Lumberjack::Device::DateRollingLogFile do
13
13
  let(:one_day){ 60 * 60 * 24 }
14
14
 
15
15
  it "should roll the file daily" do
16
- today = Date.today
17
16
  now = Time.now
18
17
  log_file = File.join(tmp_dir, "a#{rand(1000000000)}.log")
19
18
  device = Lumberjack::Device::DateRollingLogFile.new(log_file, :roll => :daily, :template => ":message")
20
19
  logger = Lumberjack::Logger.new(device, :buffer_size => 2)
21
- logger.error("test day one")
22
- logger.flush
23
- Time.stub(:now => now + one_day)
24
- Date.stub(:today => today + 1)
25
- logger.error("test day two")
26
- logger.close
27
-
28
- File.read("#{log_file}.#{today.strftime('%Y-%m-%d')}").should == "test day one#{Lumberjack::LINE_SEPARATOR}"
20
+ Timecop.travel(now) do
21
+ logger.error("test day one")
22
+ logger.flush
23
+ end
24
+ Timecop.travel(now + one_day) do
25
+ logger.error("test day two")
26
+ logger.close
27
+ end
28
+
29
+ File.read("#{log_file}.#{now.to_date.strftime('%Y-%m-%d')}").should == "test day one#{Lumberjack::LINE_SEPARATOR}"
29
30
  File.read(log_file).should == "test day two#{Lumberjack::LINE_SEPARATOR}"
30
31
  end
31
32
 
32
33
  it "should roll the file weekly" do
33
- today = Date.today
34
34
  now = Time.now
35
35
  log_file = File.join(tmp_dir, "b#{rand(1000000000)}.log")
36
36
  device = Lumberjack::Device::DateRollingLogFile.new(log_file, :roll => :weekly, :template => ":message")
37
37
  logger = Lumberjack::Logger.new(device, :buffer_size => 2)
38
- logger.error("test week one")
39
- logger.flush
40
- Time.stub(:now => now + (7 * one_day))
41
- Date.stub(:today => today + 7)
42
- logger.error("test week two")
43
- logger.close
38
+ Timecop.freeze(now) do
39
+ logger.error("test week one")
40
+ logger.flush
41
+ end
42
+ Timecop.freeze(now + (7 * one_day)) do
43
+ logger.error("test week two")
44
+ logger.close
45
+ end
44
46
 
45
- File.read("#{log_file}.#{today.strftime('week-of-%Y-%m-%d')}").should == "test week one#{Lumberjack::LINE_SEPARATOR}"
47
+ File.read("#{log_file}.#{now.to_date.strftime('week-of-%Y-%m-%d')}").should == "test week one#{Lumberjack::LINE_SEPARATOR}"
46
48
  File.read(log_file).should == "test week two#{Lumberjack::LINE_SEPARATOR}"
47
49
  end
48
50
 
49
51
  it "should roll the file monthly" do
50
- today = Date.today
51
52
  now = Time.now
52
53
  log_file = File.join(tmp_dir, "c#{rand(1000000000)}.log")
53
54
  device = Lumberjack::Device::DateRollingLogFile.new(log_file, :roll => :monthly, :template => ":message")
54
55
  logger = Lumberjack::Logger.new(device, :buffer_size => 2)
55
- logger.error("test month one")
56
- logger.flush
57
- Time.stub(:now => now + (31 * one_day))
58
- Date.stub(:today => today + 31)
59
- logger.error("test month two")
60
- logger.close
61
-
62
- File.read("#{log_file}.#{today.strftime('%Y-%m')}").should == "test month one#{Lumberjack::LINE_SEPARATOR}"
56
+ Timecop.freeze(now) do
57
+ logger.error("test month one")
58
+ logger.flush
59
+ end
60
+ Timecop.freeze(now + (31 * one_day)) do
61
+ logger.error("test month two")
62
+ logger.close
63
+ end
64
+
65
+ File.read("#{log_file}.#{now.to_date.strftime('%Y-%m')}").should == "test month one#{Lumberjack::LINE_SEPARATOR}"
63
66
  File.read(log_file).should == "test month two#{Lumberjack::LINE_SEPARATOR}"
64
67
  end
65
68
 
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  describe Lumberjack::Device::LogFile do
@@ -23,4 +24,21 @@ describe Lumberjack::Device::LogFile do
23
24
  File.read(log_file).should == "Existing contents\nNew log entry#{Lumberjack::LINE_SEPARATOR}"
24
25
  end
25
26
 
27
+ it "properly handles messages with broken UTF-8 characters" do
28
+ log_file = File.join(tmp_dir, "test_6.log")
29
+ device = Lumberjack::Device::LogFile.new(log_file,
30
+ :keep => 2, :buffer_size => 32767)
31
+
32
+ message = [0xC4, 0x90, 0xE1, 0xBB].pack("c*").force_encoding "ASCII-8BIT"
33
+ entry = Lumberjack::LogEntry.new(Time.now, 1, message, nil, $$, nil)
34
+ device.write entry
35
+
36
+ message = "проверка"
37
+ entry = Lumberjack::LogEntry.new(Time.now, 1, message, nil, $$, nil)
38
+ device.write entry
39
+
40
+ expect do
41
+ device.flush
42
+ end.to_not raise_error
43
+ end
26
44
  end
@@ -16,7 +16,7 @@ describe Lumberjack::Device::RollingLogFile do
16
16
  it "should check for rolling the log file on flush" do
17
17
  device = Lumberjack::Device::RollingLogFile.new(File.join(tmp_dir, "test.log"), :buffer_size => 32767)
18
18
  device.write(entry)
19
- device.should_receive(:roll_file?).twice.and_return(false)
19
+ expect(device).to receive(:roll_file?).twice.and_return(false)
20
20
  device.flush
21
21
  device.close
22
22
  end
@@ -24,8 +24,8 @@ describe Lumberjack::Device::RollingLogFile do
24
24
  it "should roll the file by archiving the existing file and opening a new stream and calling after_roll" do
25
25
  log_file = File.join(tmp_dir, "test_2.log")
26
26
  device = Lumberjack::Device::RollingLogFile.new(log_file, :template => ":message", :buffer_size => 32767)
27
- device.should_receive(:roll_file?).and_return(false, true)
28
- device.should_receive(:after_roll)
27
+ expect(device).to receive(:roll_file?).and_return(false, true)
28
+ expect(device).to receive(:after_roll)
29
29
  device.stub(:archive_file_suffix => "rolled")
30
30
  device.write(entry)
31
31
  device.flush
@@ -108,12 +108,12 @@ describe Lumberjack::Device::RollingLogFile do
108
108
  it "should only keep a specified number of archived log files" do
109
109
  log_file = File.join(tmp_dir, "test_5.log")
110
110
  device = Lumberjack::Device::RollingLogFile.new(log_file, :template => ":message", :keep => 2, :buffer_size => 32767)
111
- device.should_receive(:roll_file?).and_return(false, true, true, true)
112
- device.should_receive(:archive_file_suffix).and_return("delete", "another", "keep")
111
+ expect(device).to receive(:roll_file?).and_return(false, true, true, true)
112
+ expect(device).to receive(:archive_file_suffix).and_return("delete", "another", "keep")
113
113
  t = Time.now
114
- File.should_receive(:ctime).with("#{log_file}.delete").at_least(1).times.and_return(t + 1)
115
- File.should_receive(:ctime).with("#{log_file}.another").at_least(1).times.and_return(t + 2)
116
- File.should_receive(:ctime).with("#{log_file}.keep").at_least(1).times.and_return(t + 3)
114
+ expect(File).to receive(:ctime).with("#{log_file}.delete").at_least(1).times.and_return(t + 1)
115
+ expect(File).to receive(:ctime).with("#{log_file}.another").at_least(1).times.and_return(t + 2)
116
+ expect(File).to receive(:ctime).with("#{log_file}.keep").at_least(1).times.and_return(t + 3)
117
117
  device.write(entry)
118
118
  device.flush
119
119
  device.write(entry)
@@ -125,4 +125,26 @@ describe Lumberjack::Device::RollingLogFile do
125
125
  Dir.glob("#{log_file}*").sort.should == [log_file, "#{log_file}.another", "#{log_file}.keep"]
126
126
  end
127
127
 
128
+ context "when file is rolled" do
129
+ let(:log_file) { File.join(tmp_dir, "test_6.log") }
130
+
131
+ let(:device) do
132
+ device = Lumberjack::Device::RollingLogFile.new(log_file, :template => ":message", :keep => 2, :buffer_size => 32767)
133
+ device.stub(:roll_file?).and_return(true)
134
+ device.stub(:archive_file_suffix => "rolled")
135
+ device
136
+ end
137
+
138
+ before do
139
+ device.write(entry)
140
+ device.flush
141
+ end
142
+
143
+ it "reopens file with proper encoding" do
144
+ encoding = device.send(:stream).external_encoding
145
+ expect(encoding).to_not be_nil
146
+ expect(encoding.name).to eq "ASCII-8BIT"
147
+ end
148
+ end
149
+
128
150
  end
@@ -7,10 +7,10 @@ describe Lumberjack do
7
7
  Lumberjack.unit_of_work_id.should == nil
8
8
  Lumberjack.unit_of_work do
9
9
  id_1 = Lumberjack.unit_of_work_id
10
- id_1.should match(/^[0-9A-F]{12}$/)
10
+ id_1.should match(/^[0-9a-f]{12}$/)
11
11
  Lumberjack.unit_of_work do
12
12
  id_2 = Lumberjack.unit_of_work_id
13
- id_2.should match(/^[0-9A-F]{12}$/)
13
+ id_2.should match(/^[0-9a-f]{12}$/)
14
14
  id_2.should_not == id_1
15
15
  end
16
16
  id_1.should == Lumberjack.unit_of_work_id
@@ -1,6 +1,16 @@
1
1
  require File.expand_path("../../lib/lumberjack.rb", __FILE__)
2
2
  require 'stringio'
3
3
  require 'fileutils'
4
+ require 'timecop'
5
+
6
+ RSpec.configure do |config|
7
+ config.expect_with :rspec do |c|
8
+ c.syntax = [:should, :expect]
9
+ end
10
+ config.mock_with :rspec do |c|
11
+ c.syntax = [:should, :expect]
12
+ end
13
+ end
4
14
 
5
15
  def tmp_dir
6
16
  File.expand_path("../tmp", __FILE__)
metadata CHANGED
@@ -1,21 +1,49 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lumberjack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Durand
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-25 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2016-01-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: timecop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.8.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.8.0
13
41
  description: A simple, powerful, and very fast logging utility that can be a drop
14
42
  in replacement for Logger or ActiveSupport::BufferedLogger. Provides support for
15
43
  automatically rolling log files even with multiple processes writing the same log
16
44
  file.
17
45
  email:
18
- - bdurand@embellishedvisions.com
46
+ - bbdurand@gmail.com
19
47
  executables: []
20
48
  extensions: []
21
49
  extra_rdoc_files:
@@ -85,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
113
  version: '0'
86
114
  requirements: []
87
115
  rubyforge_project:
88
- rubygems_version: 2.3.0
116
+ rubygems_version: 2.4.5
89
117
  signing_key:
90
118
  specification_version: 4
91
119
  summary: A simple, powerful, and very fast logging utility that can be a drop in replacement