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 +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
|