Skip to content

Commit 0864085

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 when having Timeout raise a specific subclass. Fixes Ruby Bug 9115.
1 parent 4278b3e commit 0864085

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

lib/logger.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,14 +370,19 @@ def fatal!; self.level = FATAL; end
370370
# +shift_period_suffix+::
371371
# The log file suffix format for +daily+, +weekly+ or +monthly+ rotation.
372372
# Default is '%Y%m%d'.
373+
# +reraise_write_errors+::
374+
# An array of exception classes, which will be reraised if there is an
375+
# error when writing to the log device. The default is to swallow all
376+
# exceptions raised.
373377
#
374378
# === Description
375379
#
376380
# Create an instance.
377381
#
378382
def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
379383
progname: nil, formatter: nil, datetime_format: nil,
380-
binmode: false, shift_period_suffix: '%Y%m%d')
384+
binmode: false, shift_period_suffix: '%Y%m%d',
385+
reraise_write_errors: [])
381386
self.level = level
382387
self.progname = progname
383388
@default_formatter = Formatter.new
@@ -388,7 +393,8 @@ def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
388393
@logdev = LogDevice.new(logdev, shift_age: shift_age,
389394
shift_size: shift_size,
390395
shift_period_suffix: shift_period_suffix,
391-
binmode: binmode)
396+
binmode: binmode,
397+
reraise_write_errors: reraise_write_errors)
392398
end
393399
end
394400

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)