Skip to content

Commit 436a7d6

Browse files
committed
Add reraise_write_errors keyword argument to Logger and LogDevice
This allows the user to specify exception classes to treat as regular exceptions instead of being swallowed. Among other things, it is useful for having Logger work with Timeout. Fixes Ruby Bug 9115.
1 parent b23069d commit 436a7d6

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

lib/logger.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -574,10 +574,14 @@ def fatal!; self.level = FATAL; end
574574
# - +shift_period_suffix+: sets the format for the filename suffix
575575
# for periodic log file rotation; default is <tt>'%Y%m%d'</tt>.
576576
# See {Periodic Rotation}[rdoc-ref:Logger@Periodic+Rotation].
577+
# - +reraise_write_errors+: An array of exception classes, which will
578+
# be reraised if there is an error when writing to the log device.
579+
# The default is to swallow all exceptions raised.
577580
#
578581
def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
579582
progname: nil, formatter: nil, datetime_format: nil,
580-
binmode: false, shift_period_suffix: '%Y%m%d')
583+
binmode: false, shift_period_suffix: '%Y%m%d',
584+
reraise_write_errors: [])
581585
self.level = level
582586
self.progname = progname
583587
@default_formatter = Formatter.new
@@ -589,7 +593,8 @@ def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
589593
@logdev = LogDevice.new(logdev, shift_age: shift_age,
590594
shift_size: shift_size,
591595
shift_period_suffix: shift_period_suffix,
592-
binmode: binmode)
596+
binmode: binmode,
597+
reraise_write_errors: reraise_write_errors)
593598
end
594599
end
595600

lib/logger/log_device.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ class LogDevice
1111
attr_reader :filename
1212
include MonitorMixin
1313

14-
def initialize(log = nil, shift_age: nil, shift_size: nil, shift_period_suffix: nil, binmode: false)
14+
def initialize(log = nil, shift_age: nil, shift_size: nil, shift_period_suffix: nil, binmode: false, reraise_write_errors: [])
1515
@dev = @filename = @shift_age = @shift_size = @shift_period_suffix = nil
1616
@binmode = binmode
17+
@reraise_write_errors = reraise_write_errors
1718
mon_initialize
1819
set_dev(log)
1920
if @filename
@@ -34,16 +35,22 @@ def write(message)
3435
if @shift_age and @dev.respond_to?(:stat)
3536
begin
3637
check_shift_log
38+
rescue *@reraise_write_errors
39+
raise
3740
rescue
3841
warn("log shifting failed. #{$!}")
3942
end
4043
end
4144
begin
4245
@dev.write(message)
46+
rescue *@reraise_write_errors
47+
raise
4348
rescue
4449
warn("log writing failed. #{$!}")
4550
end
4651
end
52+
rescue *@reraise_write_errors
53+
raise
4754
rescue Exception => ignored
4855
warn("log writing failed. #{ignored}")
4956
end

test/logger/test_logger.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,15 @@ def test_string_level
113113
assert_raise(ArgumentError) { @logger.level = 'something_wrong' }
114114
end
115115

116+
def test_reraise_write_errors
117+
c = Object.new
118+
e = Class.new(StandardError)
119+
c.define_singleton_method(:write){|*| raise e}
120+
c.define_singleton_method(:close){}
121+
logger = Logger.new(c, :reraise_write_errors=>[e])
122+
assert_raise(e) { logger.warn('foo') }
123+
end
124+
116125
def test_progname
117126
assert_nil(@logger.progname)
118127
@logger.progname = "name"

0 commit comments

Comments
 (0)