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 +4 -4
- data/VERSION +1 -1
- data/lib/lumberjack.rb +9 -9
- data/lib/lumberjack/device.rb +6 -6
- data/lib/lumberjack/device/date_rolling_log_file.rb +14 -9
- data/lib/lumberjack/device/log_file.rb +3 -1
- data/lib/lumberjack/device/rolling_log_file.rb +24 -24
- data/lib/lumberjack/device/size_rolling_log_file.rb +3 -2
- data/lib/lumberjack/device/writer.rb +1 -1
- data/lib/lumberjack/formatter.rb +4 -4
- data/lib/lumberjack/rack.rb +1 -1
- data/spec/device/date_rolling_log_file_spec.rb +29 -26
- data/spec/device/log_file_spec.rb +18 -0
- data/spec/device/rolling_log_file_spec.rb +30 -8
- data/spec/lumberjack_spec.rb +2 -2
- data/spec/spec_helper.rb +10 -0
- metadata +33 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a62ab302df8141afb410a4c50c4caf6209ec5c5
|
4
|
+
data.tar.gz: 36e54fd44f8af8a3970a34f2dc3c3bfb011a6ff8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ac3c76a1e33bab723ff97a9a667d36a630f07541571518786f175b01f0a3ee49ac0ace70ecadd3a7ecb8db38d109b7967aa7abf7e85b123d7cb73de505c6d93
|
7
|
+
data.tar.gz: 6f67110bc4ee430122fab313bdd730c5c079060a4430377bc8c68651b5292e4b0452e4dbf15415902c69775ca2a88aab35fc4eb4e6b06bad4871604ed18a8f0f
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.10
|
data/lib/lumberjack.rb
CHANGED
@@ -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
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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 ||=
|
29
|
+
id ||= SecureRandom.hex(6)
|
30
30
|
Thread.current[:lumberjack_logger_unit_of_work_id] = id
|
31
31
|
begin
|
32
32
|
return yield
|
data/lib/lumberjack/device.rb
CHANGED
@@ -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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
-
|
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
|
-
|
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 =>
|
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
|
41
|
+
@manual || stream.stat.size > @max_size
|
42
|
+
rescue SystemCallError
|
42
43
|
false
|
43
44
|
end
|
44
45
|
|
data/lib/lumberjack/formatter.rb
CHANGED
@@ -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
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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 = {}
|
data/lib/lumberjack/rack.rb
CHANGED
@@ -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
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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}.#{
|
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
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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.
|
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.
|
28
|
-
device.
|
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.
|
112
|
-
device.
|
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.
|
115
|
-
File.
|
116
|
-
File.
|
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
|
data/spec/lumberjack_spec.rb
CHANGED
@@ -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-
|
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-
|
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
|
data/spec/spec_helper.rb
CHANGED
@@ -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.
|
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:
|
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
|
-
-
|
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.
|
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
|