Skip to content

Commit a67b811

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 d5e9dba commit a67b811

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
@@ -575,10 +575,14 @@ def fatal!; self.level = FATAL; end
575575
# - +shift_period_suffix+: sets the format for the filename suffix
576576
# for periodic log file rotation; default is <tt>'%Y%m%d'</tt>.
577577
# See {Periodic Rotation}[rdoc-ref:Logger@Periodic+Rotation].
578+
# - +reraise_write_errors+: An array of exception classes, which will
579+
# be reraised if there is an error when writing to the log device.
580+
# The default is to swallow all exceptions raised.
578581
#
579582
def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
580583
progname: nil, formatter: nil, datetime_format: nil,
581-
binmode: false, shift_period_suffix: '%Y%m%d')
584+
binmode: false, shift_period_suffix: '%Y%m%d',
585+
reraise_write_errors: [])
582586
self.level = level
583587
self.progname = progname
584588
@default_formatter = Formatter.new
@@ -590,7 +594,8 @@ def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
590594
@logdev = LogDevice.new(logdev, shift_age: shift_age,
591595
shift_size: shift_size,
592596
shift_period_suffix: shift_period_suffix,
593-
binmode: binmode)
597+
binmode: binmode,
598+
reraise_write_errors: reraise_write_errors)
594599
end
595600
end
596601

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)