lumberjack 1.0.9 → 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
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