From bd9c4bf0383603e714bd797f4aced5859f96309a Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Sun, 30 Aug 2026 15:28:40 +0700 Subject: [PATCH] Preserve log devices when reopen fails --- lib/logger/log_device.rb | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/logger/log_device.rb b/lib/logger/log_device.rb index e16f3b7..6408d93 100644 --- a/lib/logger/log_device.rb +++ b/lib/logger/log_device.rb @@ -48,15 +48,30 @@ def close def reopen(log = nil, shift_age: nil, shift_size: nil, shift_period_suffix: nil, binmode: nil) # reopen the same filename if no argument, do nothing for IO log ||= @filename if @filename - @binmode = binmode unless binmode.nil? if log synchronize do - if @filename and @dev - @dev.close rescue nil # close only file opened by Logger - @filename = nil + old_state = [ + @dev, @filename, @binmode, @shift_age, @shift_size, + @shift_period_suffix, @next_rotate_time, + ] + old_dev, old_filename = old_state + @dev = @filename = nil + @binmode = binmode unless binmode.nil? + begin + close_new_dev = set_dev(log) + if @filename + set_file(shift_age, shift_size, shift_period_suffix) + else + @shift_age = @shift_size = @shift_period_suffix = @next_rotate_time = nil + end + rescue Exception + new_dev = @dev + @dev, @filename, @binmode, @shift_age, @shift_size, + @shift_period_suffix, @next_rotate_time = old_state + new_dev.close rescue nil if close_new_dev + raise end - set_dev(log) - set_file(shift_age, shift_size, shift_period_suffix) if @filename + old_dev.close rescue nil if old_filename and old_dev end end self @@ -83,9 +98,11 @@ def set_dev(log) @filename = path end end + false else @dev = open_logfile(log) @filename = log + true end end