Hello community,

here is the log from the commit of package rubygem-logging for openSUSE:Factory 
checked in at 2020-10-05 19:32:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-logging (Old)
 and      /work/SRC/openSUSE:Factory/.rubygem-logging.new.4249 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "rubygem-logging"

Mon Oct  5 19:32:00 2020 rev:2 rq:838048 version:2.3.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/rubygem-logging/rubygem-logging.changes  
2017-07-28 09:47:36.732521895 +0200
+++ 
/work/SRC/openSUSE:Factory/.rubygem-logging.new.4249/rubygem-logging.changes    
    2020-10-05 19:32:08.740953794 +0200
@@ -1,0 +2,22 @@
+Fri Sep 25 14:16:01 UTC 2020 - Stephan Kulow <co...@suse.com>
+
+updated to version 2.3.0
+ see installed History.txt
+
+  == 2.3.0 / 2020-07-04
+  
+  Enhancements
+  - all appender output is now synchronized [PR #219]
+  - renamed the `LogEvent#method` to no longer conflict with `Kernel#method` 
[PR #218]
+  - @bhuga (not the Fortnite star) added a `raise_errors` method for debugging 
[PR #203]
+  - thanks to @olleolleolle for keeping on top of Travis and Ruby versions
+  
+  Bug Fixes
+  - conosle appenders can be reopened [PR #220]
+  - fixed a race condition in the rolling file appender [PR #216]
+  - fixed a race condition when opening log file destinations [PR #208 #217]
+  - @MikaelSmith fixed a race condition in Logger creation [PR #201]
+  - documentation bug fixes [PR #184 #185 #188 #194 #209]
+  
+
+-------------------------------------------------------------------

Old:
----
  logging-2.2.2.gem

New:
----
  logging-2.3.0.gem

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ rubygem-logging.spec ++++++
--- /var/tmp/diff_new_pack.ohxbi4/_old  2020-10-05 19:32:09.248955936 +0200
+++ /var/tmp/diff_new_pack.ohxbi4/_new  2020-10-05 19:32:09.252955953 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package rubygem-logging
 #
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -12,7 +12,7 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
 
@@ -24,16 +24,16 @@
 #
 
 Name:           rubygem-logging
-Version:        2.2.2
+Version:        2.3.0
 Release:        0
 %define mod_name logging
 %define mod_full_name %{mod_name}-%{version}
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
-BuildRequires:  ruby-macros >= 5
-BuildRequires:  %{ruby}
 BuildRequires:  %{rubygem gem2rpm}
 BuildRequires:  %{rubygem rdoc > 3.10}
-Url:            http://rubygems.org/gems/logging
+BuildRequires:  %{ruby}
+BuildRequires:  ruby-macros >= 5
+URL:            http://rubygems.org/gems/logging
 Source:         https://rubygems.org/gems/%{mod_full_name}.gem
 Source1:        gem2rpm.yml
 Summary:        A flexible and extendable logging library for Ruby

++++++ logging-2.2.2.gem -> logging-2.3.0.gem ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      2017-04-12 01:17:14.000000000 +0200
+++ new/.gitignore      2020-07-05 00:22:10.000000000 +0200
@@ -12,3 +12,4 @@
 vendor/
 .rbx
 .rvmrc
+.tool-versions
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.travis.yml new/.travis.yml
--- old/.travis.yml     2017-04-12 01:17:14.000000000 +0200
+++ new/.travis.yml     2020-07-05 00:22:10.000000000 +0200
@@ -9,6 +9,8 @@
   - 2.0.0-p648
   - 2.1.10
   - 2.2.7
-  - 2.3.4
-  - 2.4.1
-  - jruby-9.1.8.0
+  - 2.3.8
+  - 2.4.9
+  - 2.5.7
+  - 2.6.5
+  - jruby-9.2.9.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/History.txt new/History.txt
--- old/History.txt     2017-04-12 01:17:14.000000000 +0200
+++ new/History.txt     2020-07-05 00:22:10.000000000 +0200
@@ -1,3 +1,18 @@
+== 2.3.0 / 2020-07-04
+
+Enhancements
+- all appender output is now synchronized [PR #219]
+- renamed the `LogEvent#method` to no longer conflict with `Kernel#method` [PR 
#218]
+- @bhuga (not the Fortnite star) added a `raise_errors` method for debugging 
[PR #203]
+- thanks to @olleolleolle for keeping on top of Travis and Ruby versions
+
+Bug Fixes
+- conosle appenders can be reopened [PR #220]
+- fixed a race condition in the rolling file appender [PR #216]
+- fixed a race condition when opening log file destinations [PR #208 #217]
+- @MikaelSmith fixed a race condition in Logger creation [PR #201]
+- documentation bug fixes [PR #184 #185 #188 #194 #209]
+
 == 2.2.2 / 2017-04-11
 
 Enhancements
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Rakefile new/Rakefile
--- old/Rakefile        2017-04-12 01:17:14.000000000 +0200
+++ new/Rakefile        2020-07-05 00:22:10.000000000 +0200
@@ -26,9 +26,9 @@
   use_gmail
 
   depend_on 'little-plugger', '~> 1.1'
-  depend_on 'multi_json',     '~> 1.10'
+  depend_on 'multi_json',     '~> 1.14'
 
-  depend_on 'test-unit', '~> 3.1', :development => true
+  depend_on 'test-unit', '~> 3.3', :development => true
   depend_on 'bones-git', '~> 1.3', :development => true
   #depend_on 'bones-rcov',   :development => true
 }
Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/examples/appenders.rb new/examples/appenders.rb
--- old/examples/appenders.rb   2017-04-12 01:17:14.000000000 +0200
+++ new/examples/appenders.rb   2020-07-05 00:22:10.000000000 +0200
@@ -1,7 +1,7 @@
 # :stopdoc:
 #
 # Appenders are used to output log events to some logging destination. The
-# same log event can be sent to multiple desitnations by associating
+# same log event can be sent to multiple destinations by associating
 # multiple appenders with the logger.
 #
 # The following is a list of all the available appenders and a brief
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/examples/mdc.rb new/examples/mdc.rb
--- old/examples/mdc.rb 2017-04-12 01:17:14.000000000 +0200
+++ new/examples/mdc.rb 2020-07-05 00:22:10.000000000 +0200
@@ -29,9 +29,9 @@
   Logging.mdc['first'] = 'John'
   Logging.mdc['last']  = 'Doe'
 
-  # in this first thread we will log some quotes by Allan Rickman
+  # in this first thread we will log some quotes by Alan Rickman
   t1 = Thread.new {
-    Logging.mdc['first'] = 'Allan'
+    Logging.mdc['first'] = 'Alan'
     Logging.mdc['last']  = 'Rickman'
 
     [ %q{I've never been able to plan my life. I just lurch from indecision to 
indecision.},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/appender.rb new/lib/logging/appender.rb
--- old/lib/logging/appender.rb 2017-04-12 01:17:14.000000000 +0200
+++ new/lib/logging/appender.rb 2020-07-05 00:22:10.000000000 +0200
@@ -9,11 +9,6 @@
 # Each subclass should provide a +write+ method that will write log
 # messages to the logging destination.
 #
-# A private +sync+ method is provided for use by subclasses. It is used to
-# synchronize writes to the logging destination, and can be used by
-# subclasses to synchronize the closing or flushing of the logging
-# destination.
-#
 class Appender
 
   attr_reader :name, :layout, :level, :filters
@@ -263,13 +258,9 @@
     "<%s name=\"%s\">" % [self.class.name.sub(%r/^Logging::/, ''), self.name]
   end
 
-  # Returns the current Encoding for the appender or nil if an encoding has
-  # not been set.
-  #
-  def encoding
-    return @encoding if defined? @encoding
-    @encoding = Object.const_defined?(:Encoding) ? Encoding.default_external : 
nil
-  end
+  # Returns the current Encoding for the appender. The default external 
econding
+  # will be used if none is explicitly set.
+  attr_reader :encoding
 
   # Set the appender encoding to the given value. The value can either be an
   # Encoding instance or a String or Symbol referring to a valid encoding.
@@ -282,9 +273,9 @@
   # Raises ArgumentError if the value is not a valid encoding.
   def encoding=( value )
     if value.nil?
-      @encoding = nil
+      @encoding = Encoding.default_external
     else
-      @encoding = Object.const_defined?(:Encoding) ? Encoding.find(value.to_s) 
: nil
+      @encoding = Encoding.find(value.to_s)
     end
   end
 
@@ -328,17 +319,6 @@
     nil
   end
 
-  # call-seq:
-  #    sync { block }
-  #
-  # Obtains an exclusive lock, runs the block, and releases the lock when
-  # the block completes. This method is re-entrant so that a single thread
-  # can call +sync+ multiple times without hanging the thread.
-  #
-  def sync( &block )
-    @mutex.synchronize(&block)
-  end
-
 end  # class Appender
 end  # module Logging
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/appenders/buffering.rb 
new/lib/logging/appenders/buffering.rb
--- old/lib/logging/appenders/buffering.rb      2017-04-12 01:17:14.000000000 
+0200
+++ new/lib/logging/appenders/buffering.rb      2020-07-05 00:22:10.000000000 
+0200
@@ -79,7 +79,7 @@
       return self if @buffer.empty?
 
       ary = nil
-      sync {
+      @mutex.synchronize {
         ary = @buffer.dup
         @buffer.clear
       }
@@ -100,7 +100,7 @@
     # Clear the underlying buffer of all log events. These events will not be
     # appended to the logging destination; they will be lost.
     def clear!
-      sync { @buffer.clear }
+      @mutex.synchronize { @buffer.clear }
     end
 
     # Configure the levels that will trigger an immediate flush of the
@@ -285,7 +285,7 @@
         canonical_write(str)
       else
         str = str.force_encoding(encoding) if encoding && str.encoding != 
encoding
-        sync {
+        @mutex.synchronize {
           @buffer << str
         }
         flush_now = @buffer.length >= @auto_flushing || immediate?(event)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/appenders/console.rb 
new/lib/logging/appenders/console.rb
--- old/lib/logging/appenders/console.rb        2017-04-12 01:17:14.000000000 
+0200
+++ new/lib/logging/appenders/console.rb        2020-07-05 00:22:10.000000000 
+0200
@@ -22,17 +22,49 @@
     #
     def initialize( *args )
       name = self.class.name.split("::").last.downcase
-      io   = Object.const_get(name.upcase)
 
       opts = args.last.is_a?(Hash) ? args.pop : {}
       name = args.shift unless args.empty?
 
-      opts[:encoding] = io.external_encoding if io.respond_to? 
:external_encoding
+      io = open_fd
+      opts[:encoding] = io.external_encoding
 
       super(name, io, opts)
-    rescue NameError
-      raise RuntimeError, "Please do not use the `Logging::Appenders::Console` 
class directly - " +
-                          "use `Logging::Appenders::Stdout` and 
`Logging::Appenders::Stderr` instead"
+    end
+
+    # Reopen the connection to the underlying logging destination. If the
+    # connection is currently closed then it will be opened. If the connection
+    # is currently open then it will be closed and immediately reopened.
+    def reopen
+      @mutex.synchronize {
+        if defined? @io && @io
+          flush
+          @io.close rescue nil
+        end
+        @io = open_fd
+      }
+      super
+      self
+    end
+
+  private
+
+    def open_fd
+      case self.class.name
+      when "Logging::Appenders::Stdout"
+        fd = STDOUT.fileno
+        encoding = STDOUT.external_encoding
+      when "Logging::Appenders::Stderr"
+        fd = STDERR.fileno
+        encoding = STDERR.external_encoding
+      else
+        raise RuntimeError, "Please do not use the 
`Logging::Appenders::Console` class directly - " +
+                            "use `Logging::Appenders::Stdout` and 
`Logging::Appenders::Stderr` instead" +
+                            " [class #{self.class.name}]"
+      end
+
+      mode = ::File::WRONLY | ::File::APPEND
+      ::IO.for_fd(fd, mode: mode, encoding: encoding)
     end
   end
 
@@ -43,7 +75,6 @@
   Stderr = Class.new(Console)
 
   # Accessor / Factory for the Stdout appender.
-  #
   def self.stdout( *args )
     if args.empty?
       return self['stdout'] || ::Logging::Appenders::Stdout.new
@@ -52,7 +83,6 @@
   end
 
   # Accessor / Factory for the Stderr appender.
-  #
   def self.stderr( *args )
     if args.empty?
       return self['stderr'] || ::Logging::Appenders::Stderr.new
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/appenders/file.rb 
new/lib/logging/appenders/file.rb
--- old/lib/logging/appenders/file.rb   2017-04-12 01:17:14.000000000 +0200
+++ new/lib/logging/appenders/file.rb   2020-07-05 00:22:10.000000000 +0200
@@ -2,14 +2,12 @@
 module Logging::Appenders
 
   # Accessor / Factory for the File appender.
-  #
   def self.file( *args )
     fail ArgumentError, '::Logging::Appenders::File needs a name as first 
argument.' if args.empty?
     ::Logging::Appenders::File.new(*args)
   end
 
   # This class provides an Appender that can write to a File.
-  #
   class File < ::Logging::Appenders::IO
 
     # call-seq:
@@ -21,15 +19,14 @@
     # writable.
     #
     # An +ArgumentError+ is raised if any of these assertions fail.
-    #
     def self.assert_valid_logfile( fn )
       if ::File.exist?(fn)
-        if not ::File.file?(fn)
+        if !::File.file?(fn)
           raise ArgumentError, "#{fn} is not a regular file"
-        elsif not ::File.writable?(fn)
+        elsif !::File.writable?(fn)
           raise ArgumentError, "#{fn} is not writeable"
         end
-      elsif not ::File.writable?(::File.dirname(fn))
+      elsif !::File.writable?(::File.dirname(fn))
         raise ArgumentError, "#{::File.dirname(fn)} is not writable"
       end
       true
@@ -45,41 +42,65 @@
     # created. If the :truncate option is set to +true+ then the file will
     # be truncated before writing begins; otherwise, log messages will be
     # appended to the file.
-    #
     def initialize( name, opts = {} )
-      @fn = opts.fetch(:filename, name)
-      raise ArgumentError, 'no filename was given' if @fn.nil?
+      @filename = opts.fetch(:filename, name)
+      raise ArgumentError, 'no filename was given' if @filename.nil?
 
-      @fn = ::File.expand_path(@fn)
-      self.class.assert_valid_logfile(@fn)
-      @mode = opts.fetch(:truncate, false) ? 'w' : 'a'
+      @filename = ::File.expand_path(@filename).freeze
+      self.class.assert_valid_logfile(@filename)
 
       self.encoding = opts.fetch(:encoding, self.encoding)
-      @mode = "#{@mode}:#{self.encoding}" if self.encoding
 
-      super(name, ::File.new(@fn, @mode), opts)
+      io = open_file
+      super(name, io, opts)
+
+      truncate if opts.fetch(:truncate, false)
     end
 
     # Returns the path to the logfile.
-    #
-    def filename() @fn.dup end
+    attr_reader :filename
 
     # Reopen the connection to the underlying logging destination. If the
     # connection is currently closed then it will be opened. If the connection
     # is currently open then it will be closed and immediately opened.
-    #
     def reopen
       @mutex.synchronize {
-        if defined? @io and @io
+        if defined? @io && @io
           flush
           @io.close rescue nil
         end
-        @io = ::File.new(@fn, @mode)
+        @io = open_file
       }
       super
       self
     end
 
-  end  # FileAppender
-end  # Logging::Appenders
 
+  protected
+
+    def truncate
+      @mutex.synchronize {
+        begin
+          @io.flock(::File::LOCK_EX)
+          @io.truncate(0)
+        ensure
+          @io.flock(::File::LOCK_UN)
+        end
+      }
+    end
+
+    def open_file
+      mode = ::File::WRONLY | ::File::APPEND
+      ::File.open(filename, mode: mode, external_encoding: encoding)
+    rescue Errno::ENOENT
+      create_file
+    end
+
+    def create_file
+      mode = ::File::WRONLY | ::File::APPEND | ::File::CREAT | ::File::EXCL
+      ::File.open(filename, mode: mode, external_encoding: encoding)
+    rescue Errno::EEXIST
+      open_file
+    end
+  end
+end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/appenders/io.rb 
new/lib/logging/appenders/io.rb
--- old/lib/logging/appenders/io.rb     2017-04-12 01:17:14.000000000 +0200
+++ new/lib/logging/appenders/io.rb     2020-07-05 00:22:10.000000000 +0200
@@ -2,7 +2,6 @@
 module Logging::Appenders
 
   # Accessor / Factory for the IO appender.
-  #
   def self.io( *args )
     return ::Logging::Appenders::IO if args.empty?
     ::Logging::Appenders::IO.new(*args)
@@ -10,14 +9,12 @@
 
   # This class provides an Appender that can write to any IO stream
   # configured for writing.
-  #
   class IO < ::Logging::Appender
     include Buffering
 
     # The method that will be used to close the IO stream. Defaults to :close
     # but can be :close_read, :close_write or nil. When nil, the IO stream
     # will not be closed when the appender's close method is called.
-    #
     attr_accessor :close_method
 
     # call-seq:
@@ -26,7 +23,6 @@
     #
     # Creates a new IO Appender using the given name that will use the _io_
     # stream as the logging destination.
-    #
     def initialize( name, io, opts = {} )
       unless io.respond_to? :write
         raise TypeError, "expecting an IO object but got '#{io.class.name}'"
@@ -47,7 +43,6 @@
     # destination if the _footer_ flag is set to +true+. Log events will
     # no longer be written to the logging destination after the appender
     # is closed.
-    #
     def close( *args )
       return self if @io.nil?
       super
@@ -61,16 +56,25 @@
       return self
     end
 
+    # Reopen the connection to the underlying logging destination. If the
+    # connection is currently closed then it will be opened. If the connection
+    # is currently open then it will be closed and immediately opened. If
+    # supported, the IO will have its sync mode set to `true` so that all 
writes
+    # are immediately flushed to the underlying operating system.
+    def reopen
+      super
+      @io.sync = true if @io.respond_to? :sync=
+      self
+    end
 
   private
 
     # This method is called by the buffering code when messages need to be
     # written to the logging destination.
-    #
     def canonical_write( str )
       return self if @io.nil?
       str = str.force_encoding(encoding) if encoding && str.encoding != 
encoding
-      @io.write str
+      @mutex.synchronize { @io.write str }
       self
     rescue StandardError => err
       handle_internal_error(err)
@@ -82,6 +86,5 @@
       ::Logging.log_internal {"appender #{name.inspect} has been disabled"}
       ::Logging.log_internal_error(err)
     end
-
-  end  # IO
-end  # Logging::Appenders
+  end
+end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/appenders/rolling_file.rb 
new/lib/logging/appenders/rolling_file.rb
--- old/lib/logging/appenders/rolling_file.rb   2017-04-12 01:17:14.000000000 
+0200
+++ new/lib/logging/appenders/rolling_file.rb   2020-07-05 00:22:10.000000000 
+0200
@@ -84,24 +84,32 @@
     #               'date'.
     #
     def initialize( name, opts = {} )
-      @roller = Roller.new name, opts
+      @roller = Roller.new(
+        opts.fetch(:filename, name),
+        age:     opts.fetch(:age, nil),
+        size:    opts.fetch(:size, nil),
+        roll_by: opts.fetch(:roll_by, nil),
+        keep:    opts.fetch(:keep, nil)
+      )
 
       # grab our options
       @size = opts.fetch(:size, nil)
       @size = Integer(@size) unless @size.nil?
 
-      @age_fn = filename + '.age'
+      @age_fn = self.filename + '.age'
       @age_fn_mtime = nil
       @age = opts.fetch(:age, nil)
 
       # create our `sufficiently_aged?` method
       build_singleton_methods
-      FileUtils.touch(@age_fn) if @age && !test(?f, @age_fn)
+      FileUtils.touch(@age_fn) if @age && !::File.file?(@age_fn)
 
       # we are opening the file in read/write mode so that a shared lock can
       # be used on the file descriptor => 
http://pubs.opengroup.org/onlinepubs/009695399/functions/fcntl.html
-      @mode = encoding ? "a+:#{encoding}" : 'a+'
-      super(name, ::File.new(filename, @mode), opts)
+      self.encoding = opts.fetch(:encoding, self.encoding)
+
+      io = open_file
+      super(name, io, opts)
 
       # if the truncate flag was set to true, then roll
       roll_now = opts.fetch(:truncate, false)
@@ -121,11 +129,11 @@
     # is currently open then it will be closed and immediately opened.
     def reopen
       @mutex.synchronize {
-        if defined?(@io) && @io
+        if defined? @io && @io
           flush
           @io.close rescue nil
         end
-        @io = ::File.new(filename, @mode)
+        @io = open_file
       }
       super
       self
@@ -134,6 +142,20 @@
 
   private
 
+    def open_file
+      mode = ::File::RDWR | ::File::APPEND
+      ::File.open(filename, mode: mode, external_encoding: encoding)
+    rescue Errno::ENOENT
+      create_file
+    end
+
+    def create_file
+      mode = ::File::RDWR | ::File::APPEND | ::File::CREAT | ::File::EXCL
+      ::File.open(filename, mode: mode, external_encoding: encoding)
+    rescue Errno::EEXIST
+      open_file
+    end
+
     # Returns the file name to use as the temporary copy location. We are
     # using copy-and-truncate semantics for rolling files so that the IO
     # file descriptor remains valid during rolling.
@@ -157,14 +179,18 @@
       return self if @io.nil?
 
       str = str.force_encoding(encoding) if encoding && str.encoding != 
encoding
-      @io.flock_sh { @io.write str }
+      @mutex.synchronize {
+        @io.flock_sh { @io.write str }
+      }
 
       if roll_required?
-        @io.flock? {
-          @age_fn_mtime = nil
-          copy_truncate if roll_required?
+        @mutex.synchronize {
+          @io.flock? {
+            @age_fn_mtime = nil
+            copy_truncate if roll_required?
+          }
+          @roller.roll_files
         }
-        @roller.roll_files
       end
       self
     rescue StandardError => err
@@ -193,7 +219,7 @@
     def copy_truncate
       return unless ::File.exist?(filename)
       FileUtils.concat filename, copy_file
-      @io.truncate 0
+      @io.truncate(0)
 
       # touch the age file if needed
       if @age
@@ -255,22 +281,22 @@
       # Create a new roller. See the RollingFile#initialize documentation for
       # the list of options.
       #
-      # name - The appender name as a String
-      # opts - The options Hash
+      # filename - the name of the file to roll
+      # age      - the age of the file at which it should be rolled
+      # size     - the size of the file in bytes at which it should be rolled
+      # roll_by  - roll either by 'number' or 'date'
+      # keep     - the number of log files to keep when rolling
       #
-      def initialize( name, opts )
+      def initialize( filename, age: nil, size: nil, roll_by: nil, keep: nil )
         # raise an error if a filename was not given
-        @fn = opts.fetch(:filename, name)
+        @fn = filename
         raise ArgumentError, 'no filename was given' if @fn.nil?
 
         if (m = RGXP.match @fn)
           @roll_by = ("#{m[2]}%d" == m[1]) ? :number : :date
         else
-          age = opts.fetch(:age, nil)
-          size = opts.fetch(:size, nil)
-
           @roll_by =
-              case opts.fetch(:roll_by, nil)
+              case roll_by
               when 'number'; :number
               when 'date'; :date
               else
@@ -293,8 +319,7 @@
         ::Logging::Appenders::File.assert_valid_logfile(filename)
 
         @roll = false
-        @keep = opts.fetch(:keep, nil)
-        @keep = Integer(keep) unless keep.nil?
+        @keep = keep.nil? ? nil : Integer(keep)
       end
 
       attr_reader :keep, :roll_by
@@ -347,7 +372,6 @@
         files.delete copy_file
 
         self.send "roll_by_#{roll_by}", files
-
         nil
       ensure
         self.roll = false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/appenders/string_io.rb 
new/lib/logging/appenders/string_io.rb
--- old/lib/logging/appenders/string_io.rb      2017-04-12 01:17:14.000000000 
+0200
+++ new/lib/logging/appenders/string_io.rb      2020-07-05 00:22:10.000000000 
+0200
@@ -62,7 +62,7 @@
     %w[read readline readlines].each do|m|
       class_eval <<-CODE, __FILE__, __LINE__+1
         def #{m}( *args )
-          sync {
+          @mutex.synchronize {
             begin
               @sio.seek @pos
               rv = @sio.#{m}(*args)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/appenders/syslog.rb 
new/lib/logging/appenders/syslog.rb
--- old/lib/logging/appenders/syslog.rb 2017-04-12 01:17:14.000000000 +0200
+++ new/lib/logging/appenders/syslog.rb 2020-07-05 00:22:10.000000000 +0200
@@ -188,7 +188,7 @@
         end
       return if message.empty?
 
-      @syslog.log(pri, '%s', message)
+      @mutex.synchronize { @syslog.log(pri, '%s', message) }
       self
     end
 
@@ -205,11 +205,10 @@
         level = level.to_s.upcase
         self.class.const_get level
       else
-        raise ArgumentError, "unkonwn level '#{level}'"
+        raise ArgumentError, "unknown level '#{level}'"
       end
     end
 
   end  # Syslog
 end  # Logging::Appenders
 end  # HAVE_SYSLOG
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/layouts/parseable.rb 
new/lib/logging/layouts/parseable.rb
--- old/lib/logging/layouts/parseable.rb        2017-04-12 01:17:14.000000000 
+0200
+++ new/lib/logging/layouts/parseable.rb        2020-07-05 00:22:10.000000000 
+0200
@@ -103,7 +103,7 @@
       'message'   => 'format_obj(event.data)'.freeze,
       'file'      => 'event.file'.freeze,
       'line'      => 'event.line'.freeze,
-      'method'    => 'event.method'.freeze,
+      'method'    => 'event.method_name'.freeze,
       'hostname'  => "'#{Socket.gethostname}'".freeze,
       'pid'       => 'Process.pid'.freeze,
       'millis'    => 'Integer((event.time-@created_at)*1000)'.freeze,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/layouts/pattern.rb 
new/lib/logging/layouts/pattern.rb
--- old/lib/logging/layouts/pattern.rb  2017-04-12 01:17:14.000000000 +0200
+++ new/lib/logging/layouts/pattern.rb  2020-07-05 00:22:10.000000000 +0200
@@ -307,7 +307,7 @@
         'l' => '::Logging::LNAMES[event.level]'.freeze,
         'L' => 'event.line'.freeze,
         'm' => 'format_obj(event.data)'.freeze,
-        'M' => 'event.method'.freeze,
+        'M' => 'event.method_name'.freeze,
         'h' => "'#{Socket.gethostname}'".freeze,
         'p' => 'Process.pid'.freeze,
         'r' => 'Integer((event.time-@created_at)*1000).to_s'.freeze,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/log_event.rb new/lib/logging/log_event.rb
--- old/lib/logging/log_event.rb        2017-04-12 01:17:14.000000000 +0200
+++ new/lib/logging/log_event.rb        2020-07-05 00:22:10.000000000 +0200
@@ -15,7 +15,7 @@
     CALLER_INDEX = ((defined? JRUBY_VERSION and JRUBY_VERSION > '1.6') or 
(defined? RUBY_ENGINE and RUBY_ENGINE[%r/^rbx/i])) ? 1 : 2
     # :startdoc:
 
-    attr_accessor :logger, :level, :data, :time, :file, :line, :method
+    attr_accessor :logger, :level, :data, :time, :file, :line, :method_name
 
     # call-seq:
     #    LogEvent.new( logger, level, [data], caller_tracing )
@@ -36,15 +36,15 @@
         return if stack.nil?
 
         match = CALLER_RGXP.match(stack)
-        self.file   = match[1]
-        self.line   = Integer(match[2])
-        self.method = match[3] unless match[3].nil?
+        self.file = match[1]
+        self.line = Integer(match[2])
+        self.method_name = match[3] unless match[3].nil?
 
         if (bp = ::Logging.basepath) && !bp.empty? && file.index(bp) == 0
           self.file = file.slice(bp.length + 1, file.length - bp.length)
         end
       else
-        self.file = self.line = self.method = ''
+        self.file = self.line = self.method_name = ''
       end
     end
   end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/logger.rb new/lib/logging/logger.rb
--- old/lib/logging/logger.rb   2017-04-12 01:17:14.000000000 +0200
+++ new/lib/logging/logger.rb   2020-07-05 00:22:10.000000000 +0200
@@ -24,8 +24,6 @@
   #
   class Logger
 
-    @mutex = Mutex.new  # :nodoc:
-
     # Returns the root logger.
     def self.root
       ::Logging::Repository.instance[:root]
@@ -48,7 +46,10 @@
       logger = repo[name]
       return logger unless logger.nil?
 
-      @mutex.synchronize do
+      # Share the same mutex that's used by 'define_log_methods' because
+      # it iterates over the hash of loggers, and adding a new key to a hash
+      # while iterating over it produces an error.
+      ::Logging::Logger.mutex.synchronize do
         logger = repo[name]
         return logger unless logger.nil? # thread-safe double checking
 
@@ -118,6 +119,14 @@
       code.join("\n")
     end
 
+    @mutex = ReentrantMutex.new
+
+    # Returns a global ReentrantMutex for use when creating Logger instances
+    # and/or updating log levels.
+    def self.mutex
+      @mutex
+    end
+
     attr_reader :name, :parent, :additive, :caller_tracing
 
     # call-seq:
@@ -411,7 +420,7 @@
     def define_log_methods( force = false, code = nil )
       return if has_own_level? and !force
 
-      ::Logging::Logger._reentrant_mutex.synchronize do
+      ::Logging::Logger.mutex.synchronize do
         ::Logging::Logger.define_log_methods(self)
         ::Logging::Repository.instance.children(name).each do |child|
           child.define_log_methods
@@ -423,12 +432,6 @@
     # :stopdoc:
   public
 
-    @reentrant_mutex = ReentrantMutex.new
-
-    def self._reentrant_mutex
-      @reentrant_mutex
-    end
-
     # call-seq:
     #    _meta_eval( code )
     #
@@ -511,6 +514,5 @@
     end
     # :startdoc:
 
-  end  # Logger
-end  # Logging
-
+  end
+end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/proxy.rb new/lib/logging/proxy.rb
--- old/lib/logging/proxy.rb    2017-04-12 01:17:14.000000000 +0200
+++ new/lib/logging/proxy.rb    2020-07-05 00:22:10.000000000 +0200
@@ -47,7 +47,7 @@
 
     # All hail the magic of method missing. Here is where we are going to log
     # the method call and then forward to the proxied object. The return value
-    # from the proxied objet method call is passed back.
+    # from the proxied object method call is passed back.
     #
     def method_missing( name, *args, &block )
       @logger << "#@leader#{name}(#{args.inspect[1..-2]})\n"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging/version.rb new/lib/logging/version.rb
--- old/lib/logging/version.rb  2017-04-12 01:17:14.000000000 +0200
+++ new/lib/logging/version.rb  2020-07-05 00:22:10.000000000 +0200
@@ -1,5 +1,5 @@
 module Logging
-  VERSION = "2.2.2".freeze
+  VERSION = "2.3.0".freeze
 
   # Returns the version string for the library.
   def self.version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/logging.rb new/lib/logging.rb
--- old/lib/logging.rb  2017-04-12 01:17:14.000000000 +0200
+++ new/lib/logging.rb  2020-07-05 00:22:10.000000000 +0200
@@ -258,6 +258,7 @@
       module_eval "MAX_LEVEL_LENGTH = #{longest.length}", __FILE__, __LINE__
 
       self.cause_depth = nil unless defined? @cause_depth
+      self.raise_errors = false unless defined? @raise_errors
 
       initialize_plugins
       levels.keys
@@ -268,8 +269,8 @@
     #
     # Defines the default _obj_format_ method to use when converting objects
     # into string representations for logging. _obj_format_ can be one of
-    # <tt>:string</tt>, <tt>:inspect</tt>, or <tt>:yaml</tt>. These
-    # formatting commands map to the following object methods
+    # <tt>:string</tt>, <tt>:inspect</tt>, <tt>:json</tt> or <tt>:yaml</tt>.
+    # These formatting commands map to the following object methods
     #
     # * :string  => to_s
     # * :inspect => inspect
@@ -277,7 +278,7 @@
     # * :json    => MultiJson.encode(obj)
     #
     # An +ArgumentError+ is raised if anything other than +:string+,
-    # +:inspect+, +:yaml+ is passed to this method.
+    # +:inspect+, +:json+ or +:yaml+ is passed to this method.
     #
     def format_as( f )
       f = f.intern if f.instance_of? String
@@ -490,6 +491,21 @@
       io
     end
 
+    # Raise an exception when an error is encountered while logging, be it with
+    # a backing store, formatter, or anything else. You probably wouldn't want
+    # to enable this outside of test.
+    #
+    # Not that only one error will ever be raised per logging backend, as
+    # backends that raise errors on write will be set to :off.
+    def raise_errors=(boolean)
+      @raise_errors = boolean
+    end
+
+    # Whether or not we should raise errors when writing logs.
+    def raise_errors?
+      @raise_errors
+    end
+
     # :stopdoc:
     # Convert the given level into a canonical form - a lowercase string.
     def levelify( level )
@@ -518,7 +534,7 @@
     # exception will be raised again.
     def log_internal_error( err )
       log_internal(-2) { err }
-      raise err if Thread.abort_on_exception
+      raise err if ::Logging.raise_errors?
     end
 
     # Close all appenders
@@ -569,8 +585,7 @@
   require libpath('logging/diagnostic_context')
 
   require libpath('logging/rails_compat')
-end  # module Logging
-
+end
 
 # This finalizer will close all the appenders that exist in the system.
 # This is needed for closing IO streams and connections to the syslog server
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/logging.gemspec new/logging.gemspec
--- old/logging.gemspec 2017-04-12 01:17:14.000000000 +0200
+++ new/logging.gemspec 2020-07-05 00:22:10.000000000 +0200
@@ -1,45 +1,44 @@
 # -*- encoding: utf-8 -*-
-# stub: logging 2.1.0.48 ruby lib
+# stub: logging 2.3.0 ruby lib
 
 Gem::Specification.new do |s|
   s.name = "logging".freeze
-  s.version = "2.1.0.48"
+  s.version = "2.3.0"
 
   s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if 
s.respond_to? :required_rubygems_version=
   s.require_paths = ["lib".freeze]
   s.authors = ["Tim Pease".freeze]
-  s.date = "2017-01-08"
+  s.date = "2020-07-04"
   s.description = "**Logging** is a flexible logging library for use in Ruby 
programs based on the\ndesign of Java's log4j library. It features a 
hierarchical logging system,\ncustom level names, multiple output destinations 
per log event, custom\nformatting, and more.".freeze
   s.email = "tim.pe...@gmail.com".freeze
   s.extra_rdoc_files = ["History.txt".freeze]
-  s.files = [".gitignore".freeze, ".travis.yml".freeze, "History.txt".freeze, 
"LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, 
"examples/appenders.rb".freeze, "examples/classes.rb".freeze, 
"examples/colorization.rb".freeze, "examples/custom_log_levels.rb".freeze, 
"examples/fork.rb".freeze, "examples/formatting.rb".freeze, 
"examples/hierarchies.rb".freeze, "examples/layouts.rb".freeze, 
"examples/lazy.rb".freeze, "examples/loggers.rb".freeze, 
"examples/mdc.rb".freeze, "examples/names.rb".freeze, 
"examples/rails4.rb".freeze, "examples/reusing_layouts.rb".freeze, 
"examples/rspec_integration.rb".freeze, "examples/simple.rb".freeze, 
"lib/logging.rb".freeze, "lib/logging/appender.rb".freeze, 
"lib/logging/appenders.rb".freeze, "lib/logging/appenders/buffering.rb".freeze, 
"lib/logging/appenders/console.rb".freeze, 
"lib/logging/appenders/file.rb".freeze, "lib/logging/appenders/io.rb".freeze, 
"lib/logging/appenders/rolling_file.rb".freeze, 
"lib/logging/appenders/string_io.rb".freeze, 
"lib/logging/appenders/syslog.rb".freeze, "lib/logging/color_scheme.rb".freeze, 
"lib/logging/diagnostic_context.rb".freeze, "lib/logging/filter.rb".freeze, 
"lib/logging/filters.rb".freeze, "lib/logging/filters/level.rb".freeze, 
"lib/logging/layout.rb".freeze, "lib/logging/layouts.rb".freeze, 
"lib/logging/layouts/basic.rb".freeze, 
"lib/logging/layouts/parseable.rb".freeze, 
"lib/logging/layouts/pattern.rb".freeze, "lib/logging/log_event.rb".freeze, 
"lib/logging/logger.rb".freeze, "lib/logging/proxy.rb".freeze, 
"lib/logging/rails_compat.rb".freeze, "lib/logging/repository.rb".freeze, 
"lib/logging/root_logger.rb".freeze, "lib/logging/utils.rb".freeze, 
"lib/logging/version.rb".freeze, "lib/rspec/logging_helper.rb".freeze, 
"lib/spec/logging_helper.rb".freeze, "logging.gemspec".freeze, 
"script/bootstrap".freeze, "script/console".freeze, 
"test/appenders/test_async_flushing.rb".freeze, 
"test/appenders/test_buffered_io.rb".freeze, 
"test/appenders/test_console.rb".freeze, "test/appenders/test_file.rb".freeze, 
"test/appenders/test_io.rb".freeze, 
"test/appenders/test_rolling_file.rb".freeze, 
"test/appenders/test_string_io.rb".freeze, 
"test/appenders/test_syslog.rb".freeze, "test/benchmark.rb".freeze, 
"test/layouts/test_basic.rb".freeze, 
"test/layouts/test_color_pattern.rb".freeze, 
"test/layouts/test_json.rb".freeze, "test/layouts/test_pattern.rb".freeze, 
"test/layouts/test_yaml.rb".freeze, "test/performance.rb".freeze, 
"test/setup.rb".freeze, "test/test_appender.rb".freeze, 
"test/test_color_scheme.rb".freeze, "test/test_filter.rb".freeze, 
"test/test_layout.rb".freeze, "test/test_log_event.rb".freeze, 
"test/test_logger.rb".freeze, "test/test_logging.rb".freeze, 
"test/test_mapped_diagnostic_context.rb".freeze, 
"test/test_nested_diagnostic_context.rb".freeze, "test/test_proxy.rb".freeze, 
"test/test_repository.rb".freeze, "test/test_root_logger.rb".freeze, 
"test/test_utils.rb".freeze]
+  s.files = [".gitignore".freeze, ".travis.yml".freeze, "History.txt".freeze, 
"LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, 
"examples/appenders.rb".freeze, "examples/classes.rb".freeze, 
"examples/colorization.rb".freeze, "examples/custom_log_levels.rb".freeze, 
"examples/fork.rb".freeze, "examples/formatting.rb".freeze, 
"examples/hierarchies.rb".freeze, "examples/layouts.rb".freeze, 
"examples/lazy.rb".freeze, "examples/loggers.rb".freeze, 
"examples/mdc.rb".freeze, "examples/names.rb".freeze, 
"examples/rails4.rb".freeze, "examples/reusing_layouts.rb".freeze, 
"examples/rspec_integration.rb".freeze, "examples/simple.rb".freeze, 
"lib/logging.rb".freeze, "lib/logging/appender.rb".freeze, 
"lib/logging/appenders.rb".freeze, "lib/logging/appenders/buffering.rb".freeze, 
"lib/logging/appenders/console.rb".freeze, 
"lib/logging/appenders/file.rb".freeze, "lib/logging/appenders/io.rb".freeze, 
"lib/logging/appenders/rolling_file.rb".freeze, 
"lib/logging/appenders/string_io.rb".freeze, 
"lib/logging/appenders/syslog.rb".freeze, "lib/logging/color_scheme.rb".freeze, 
"lib/logging/diagnostic_context.rb".freeze, "lib/logging/filter.rb".freeze, 
"lib/logging/filters.rb".freeze, "lib/logging/filters/level.rb".freeze, 
"lib/logging/layout.rb".freeze, "lib/logging/layouts.rb".freeze, 
"lib/logging/layouts/basic.rb".freeze, 
"lib/logging/layouts/parseable.rb".freeze, 
"lib/logging/layouts/pattern.rb".freeze, "lib/logging/log_event.rb".freeze, 
"lib/logging/logger.rb".freeze, "lib/logging/proxy.rb".freeze, 
"lib/logging/rails_compat.rb".freeze, "lib/logging/repository.rb".freeze, 
"lib/logging/root_logger.rb".freeze, "lib/logging/utils.rb".freeze, 
"lib/logging/version.rb".freeze, "lib/rspec/logging_helper.rb".freeze, 
"lib/spec/logging_helper.rb".freeze, "logging.gemspec".freeze, 
"script/bootstrap".freeze, "script/console".freeze, 
"test/appenders/test_async_flushing.rb".freeze, 
"test/appenders/test_buffered_io.rb".freeze, 
"test/appenders/test_console.rb".freeze, "test/appenders/test_file.rb".freeze, 
"test/appenders/test_io.rb".freeze, 
"test/appenders/test_rolling_file.rb".freeze, 
"test/appenders/test_string_io.rb".freeze, 
"test/appenders/test_syslog.rb".freeze, "test/benchmark.rb".freeze, 
"test/layouts/test_basic.rb".freeze, 
"test/layouts/test_color_pattern.rb".freeze, 
"test/layouts/test_json.rb".freeze, 
"test/layouts/test_nested_exceptions.rb".freeze, 
"test/layouts/test_pattern.rb".freeze, "test/layouts/test_yaml.rb".freeze, 
"test/performance.rb".freeze, "test/setup.rb".freeze, 
"test/test_appender.rb".freeze, "test/test_color_scheme.rb".freeze, 
"test/test_filter.rb".freeze, "test/test_layout.rb".freeze, 
"test/test_log_event.rb".freeze, "test/test_logger.rb".freeze, 
"test/test_logging.rb".freeze, "test/test_mapped_diagnostic_context.rb".freeze, 
"test/test_nested_diagnostic_context.rb".freeze, "test/test_proxy.rb".freeze, 
"test/test_repository.rb".freeze, "test/test_root_logger.rb".freeze, 
"test/test_utils.rb".freeze]
   s.homepage = "http://rubygems.org/gems/logging".freeze
   s.rdoc_options = ["--main".freeze, "README.md".freeze]
-  s.rubyforge_project = "logging".freeze
-  s.rubygems_version = "2.5.2".freeze
+  s.rubygems_version = "3.0.1".freeze
   s.summary = "A flexible and extendable logging library for Ruby".freeze
-  s.test_files = ["test/appenders/test_async_flushing.rb".freeze, 
"test/appenders/test_buffered_io.rb".freeze, 
"test/appenders/test_console.rb".freeze, "test/appenders/test_file.rb".freeze, 
"test/appenders/test_io.rb".freeze, 
"test/appenders/test_rolling_file.rb".freeze, 
"test/appenders/test_string_io.rb".freeze, 
"test/appenders/test_syslog.rb".freeze, "test/layouts/test_basic.rb".freeze, 
"test/layouts/test_color_pattern.rb".freeze, 
"test/layouts/test_json.rb".freeze, "test/layouts/test_pattern.rb".freeze, 
"test/layouts/test_yaml.rb".freeze, "test/test_appender.rb".freeze, 
"test/test_color_scheme.rb".freeze, "test/test_filter.rb".freeze, 
"test/test_layout.rb".freeze, "test/test_log_event.rb".freeze, 
"test/test_logger.rb".freeze, "test/test_logging.rb".freeze, 
"test/test_mapped_diagnostic_context.rb".freeze, 
"test/test_nested_diagnostic_context.rb".freeze, "test/test_proxy.rb".freeze, 
"test/test_repository.rb".freeze, "test/test_root_logger.rb".freeze, 
"test/test_utils.rb".freeze]
+  s.test_files = ["test/appenders/test_async_flushing.rb".freeze, 
"test/appenders/test_buffered_io.rb".freeze, 
"test/appenders/test_console.rb".freeze, "test/appenders/test_file.rb".freeze, 
"test/appenders/test_io.rb".freeze, 
"test/appenders/test_rolling_file.rb".freeze, 
"test/appenders/test_string_io.rb".freeze, 
"test/appenders/test_syslog.rb".freeze, "test/layouts/test_basic.rb".freeze, 
"test/layouts/test_color_pattern.rb".freeze, 
"test/layouts/test_json.rb".freeze, 
"test/layouts/test_nested_exceptions.rb".freeze, 
"test/layouts/test_pattern.rb".freeze, "test/layouts/test_yaml.rb".freeze, 
"test/test_appender.rb".freeze, "test/test_color_scheme.rb".freeze, 
"test/test_filter.rb".freeze, "test/test_layout.rb".freeze, 
"test/test_log_event.rb".freeze, "test/test_logger.rb".freeze, 
"test/test_logging.rb".freeze, "test/test_mapped_diagnostic_context.rb".freeze, 
"test/test_nested_diagnostic_context.rb".freeze, "test/test_proxy.rb".freeze, 
"test/test_repository.rb".freeze, "test/test_root_logger.rb".freeze, 
"test/test_utils.rb".freeze]
 
   if s.respond_to? :specification_version then
     s.specification_version = 4
 
     if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
       s.add_runtime_dependency(%q<little-plugger>.freeze, ["~> 1.1"])
-      s.add_runtime_dependency(%q<multi_json>.freeze, ["~> 1.10"])
-      s.add_development_dependency(%q<test-unit>.freeze, ["~> 3.1"])
+      s.add_runtime_dependency(%q<multi_json>.freeze, ["~> 1.14"])
+      s.add_development_dependency(%q<test-unit>.freeze, ["~> 3.3"])
       s.add_development_dependency(%q<bones-git>.freeze, ["~> 1.3"])
       s.add_development_dependency(%q<bones>.freeze, [">= 3.8.4"])
     else
       s.add_dependency(%q<little-plugger>.freeze, ["~> 1.1"])
-      s.add_dependency(%q<multi_json>.freeze, ["~> 1.10"])
-      s.add_dependency(%q<test-unit>.freeze, ["~> 3.1"])
+      s.add_dependency(%q<multi_json>.freeze, ["~> 1.14"])
+      s.add_dependency(%q<test-unit>.freeze, ["~> 3.3"])
       s.add_dependency(%q<bones-git>.freeze, ["~> 1.3"])
       s.add_dependency(%q<bones>.freeze, [">= 3.8.4"])
     end
   else
     s.add_dependency(%q<little-plugger>.freeze, ["~> 1.1"])
-    s.add_dependency(%q<multi_json>.freeze, ["~> 1.10"])
-    s.add_dependency(%q<test-unit>.freeze, ["~> 3.1"])
+    s.add_dependency(%q<multi_json>.freeze, ["~> 1.14"])
+    s.add_dependency(%q<test-unit>.freeze, ["~> 3.3"])
     s.add_dependency(%q<bones-git>.freeze, ["~> 1.3"])
     s.add_dependency(%q<bones>.freeze, [">= 3.8.4"])
   end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata        2017-04-12 01:17:14.000000000 +0200
+++ new/metadata        2020-07-05 00:22:10.000000000 +0200
@@ -1,14 +1,14 @@
 --- !ruby/object:Gem::Specification
 name: logging
 version: !ruby/object:Gem::Version
-  version: 2.2.2
+  version: 2.3.0
 platform: ruby
 authors:
 - Tim Pease
-autorequire: 
+autorequire:
 bindir: bin
 cert_chain: []
-date: 2017-04-11 00:00:00.000000000 Z
+date: 2020-07-04 00:00:00.000000000 Z
 dependencies:
 - !ruby/object:Gem::Dependency
   name: little-plugger
@@ -30,28 +30,28 @@
     requirements:
     - - "~>"
       - !ruby/object:Gem::Version
-        version: '1.10'
+        version: '1.14'
   type: :runtime
   prerelease: false
   version_requirements: !ruby/object:Gem::Requirement
     requirements:
     - - "~>"
       - !ruby/object:Gem::Version
-        version: '1.10'
+        version: '1.14'
 - !ruby/object:Gem::Dependency
   name: test-unit
   requirement: !ruby/object:Gem::Requirement
     requirements:
     - - "~>"
       - !ruby/object:Gem::Version
-        version: '3.1'
+        version: '3.3'
   type: :development
   prerelease: false
   version_requirements: !ruby/object:Gem::Requirement
     requirements:
     - - "~>"
       - !ruby/object:Gem::Version
-        version: '3.1'
+        version: '3.3'
 - !ruby/object:Gem::Dependency
   name: bones-git
   requirement: !ruby/object:Gem::Requirement
@@ -179,7 +179,7 @@
 homepage: http://rubygems.org/gems/logging
 licenses: []
 metadata: {}
-post_install_message: 
+post_install_message:
 rdoc_options:
 - "--main"
 - README.md
@@ -196,9 +196,8 @@
     - !ruby/object:Gem::Version
       version: '0'
 requirements: []
-rubyforge_project: logging
-rubygems_version: 2.6.11
-signing_key: 
+rubygems_version: 3.0.1
+signing_key:
 specification_version: 4
 summary: A flexible and extendable logging library for Ruby
 test_files:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/appenders/test_buffered_io.rb 
new/test/appenders/test_buffered_io.rb
--- old/test/appenders/test_buffered_io.rb      2017-04-12 01:17:14.000000000 
+0200
+++ new/test/appenders/test_buffered_io.rb      2020-07-05 00:22:10.000000000 
+0200
@@ -194,24 +194,22 @@
       assert_nil(readline)
     end
 
-    if Object.const_defined?(:Encoding)
-      def test_force_encoding
-        a = 'ümlaut'
-        b = 'hello ümlaut'.force_encoding('BINARY')
+    def test_force_encoding
+      a = 'ümlaut'
+      b = 'hello ümlaut'.force_encoding('BINARY')
 
-        event_a = Logging::LogEvent.new('TestLogger', @levels['info'], a, 
false)
-        event_b = Logging::LogEvent.new('TestLogger', @levels['info'], b, 
false)
+      event_a = Logging::LogEvent.new('TestLogger', @levels['info'], a, false)
+      event_b = Logging::LogEvent.new('TestLogger', @levels['info'], b, false)
 
-        @appender.append event_a
-        @appender.append event_b
-        assert_nil(readline)
+      @appender.append event_a
+      @appender.append event_b
+      assert_nil(readline)
 
-        @appender.append event_a
-        assert_equal " INFO  TestLogger : #{a}\n", readline
-        assert_equal " INFO  TestLogger : #{b.force_encoding('UTF-8')}\n", 
readline
-        assert_equal " INFO  TestLogger : #{a}\n", readline
-        assert_nil(readline)
-      end
+      @appender.append event_a
+      assert_equal " INFO  TestLogger : #{a}\n", readline
+      assert_equal " INFO  TestLogger : #{b.force_encoding('UTF-8')}\n", 
readline
+      assert_equal " INFO  TestLogger : #{a}\n", readline
+      assert_nil(readline)
     end
 
   private
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/appenders/test_console.rb 
new/test/appenders/test_console.rb
--- old/test/appenders/test_console.rb  2017-04-12 01:17:14.000000000 +0200
+++ new/test/appenders/test_console.rb  2020-07-05 00:22:10.000000000 +0200
@@ -20,11 +20,10 @@
 
       appender = Logging.appenders.stdout
       assert_equal 'stdout', appender.name
-      assert_same STDOUT, appender.instance_variable_get(:@io)
 
-      appender.close
-      assert_equal true, appender.closed?
-      assert_equal false, STDOUT.closed?
+      io = appender.instance_variable_get(:@io)
+      refute_same STDOUT, io
+      assert_equal STDOUT.fileno, io.fileno
 
       appender = Logging.appenders.stdout('foo')
       assert_equal 'foo', appender.name
@@ -38,7 +37,26 @@
       assert_equal 3, appender.level
     end
 
-  end  # class TestStdout
+    def test_reopen
+      Logging::Repository.instance
+
+      appender = Logging.appenders.stdout
+      io = appender.instance_variable_get(:@io)
+
+      appender.close
+      assert appender.closed?
+      assert io.closed?
+      refute STDOUT.closed?
+
+      appender.reopen
+      refute appender.closed?
+
+      new_io = appender.instance_variable_get(:@io)
+      refute_same io, new_io
+      refute new_io.closed?
+      assert io.closed?
+    end
+  end
 
   class TestStderr < Test::Unit::TestCase
     include LoggingTestCase
@@ -48,11 +66,10 @@
 
       appender = Logging.appenders.stderr
       assert_equal 'stderr', appender.name
-      assert_same STDERR, appender.instance_variable_get(:@io)
 
-      appender.close
-      assert_equal true, appender.closed?
-      assert_equal false, STDERR.closed?
+      io = appender.instance_variable_get(:@io)
+      refute_same STDERR, io
+      assert_same STDERR.fileno, io.fileno
 
       appender = Logging.appenders.stderr('foo')
       assert_equal 'foo', appender.name
@@ -66,8 +83,26 @@
       assert_equal 3, appender.level
     end
 
-  end  # class TestStderr
+    def test_reopen
+      Logging::Repository.instance
+
+      appender = Logging.appenders.stderr
+      io = appender.instance_variable_get(:@io)
 
-end  # module TestAppenders
-end  # module TestLogging
+      appender.close
+      assert appender.closed?
+      assert io.closed?
+      refute STDERR.closed?
+
+      appender.reopen
+      refute appender.closed?
+
+      new_io = appender.instance_variable_get(:@io)
+      refute_same io, new_io
+      refute new_io.closed?
+      assert io.closed?
+    end
+  end
+end
+end
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/appenders/test_file.rb 
new/test/appenders/test_file.rb
--- old/test/appenders/test_file.rb     2017-04-12 01:17:14.000000000 +0200
+++ new/test/appenders/test_file.rb     2020-07-05 00:22:10.000000000 +0200
@@ -14,10 +14,10 @@
       super
       Logging.init
 
-      FileUtils.mkdir [File.join(TMP, 'dir'), File.join(TMP, 'uw_dir')]
-      FileUtils.chmod 0555, File.join(TMP, 'uw_dir')
-      FileUtils.touch File.join(TMP, 'uw_file')
-      FileUtils.chmod 0444, File.join(TMP, 'uw_file')
+      FileUtils.mkdir [File.join(@tmpdir, 'dir'), File.join(@tmpdir, 'uw_dir')]
+      FileUtils.chmod 0555, File.join(@tmpdir, 'uw_dir')
+      FileUtils.touch File.join(@tmpdir, 'uw_file')
+      FileUtils.chmod 0444, File.join(@tmpdir, 'uw_file')
     end
 
     def test_factory_method_validates_input
@@ -27,27 +27,27 @@
     end
 
     def test_class_assert_valid_logfile
-      log = File.join(TMP, 'uw_dir', 'file.log')
+      log = File.join(@tmpdir, 'uw_dir', 'file.log')
       assert_raise(ArgumentError) do
         Logging.appenders.file(log).class.assert_valid_logfile(log)
       end
 
-      log = File.join(TMP, 'dir')
+      log = File.join(@tmpdir, 'dir')
       assert_raise(ArgumentError) do
         Logging.appenders.file(log).class.assert_valid_logfile(log)
       end
 
-      log = File.join(TMP, 'uw_file')
+      log = File.join(@tmpdir, 'uw_file')
       assert_raise(ArgumentError) do
         Logging.appenders.file(log).class.assert_valid_logfile(log)
       end
 
-      log = File.join(TMP, 'file.log')
+      log = File.join(@tmpdir, 'file.log')
       assert Logging.appenders.file(log).class.assert_valid_logfile(log)
     end
 
     def test_initialize
-      log = File.join(TMP, 'file.log')
+      log = File.join(@tmpdir, 'file.log')
       appender = Logging.appenders.file(NAME, :filename => log)
       assert_equal 'logfile', appender.name
       assert_equal ::File.expand_path(log), appender.filename
@@ -87,7 +87,7 @@
     end
 
     def test_changing_directories
-      log = File.join(TMP, 'file.log')
+      log = File.join(@tmpdir, 'file.log')
       appender = Logging.appenders.file(NAME, :filename => log)
 
       assert_equal 'logfile', appender.name
@@ -95,29 +95,45 @@
 
       begin
         pwd = Dir.pwd
-        Dir.chdir TMP
+        Dir.chdir @tmpdir
         assert_nothing_raised { appender.reopen }
       ensure
         Dir.chdir pwd
       end
     end
 
-    if Object.const_defined? :Encoding
+    def test_encoding
+      log = File.join(@tmpdir, 'file-encoding.log')
+      appender = Logging.appenders.file(NAME, :filename => log, :encoding => 
'ASCII')
+
+      appender << "A normal line of text\n"
+      appender << "ümlaut\n"
+      appender.close
+
+      lines = File.readlines(log, :encoding => 'UTF-8')
+      assert_equal "A normal line of text\n", lines[0]
+      assert_equal "ümlaut\n", lines[1]
 
-      def test_encoding
-        log = File.join(TMP, 'file-encoding.log')
-        appender = Logging.appenders.file(NAME, :filename => log, :encoding => 
'ASCII')
+      cleanup
+    end
 
-        appender << "A normal line of text\n"
-        appender << "ümlaut\n"
-        appender.close
+    def test_reopening_should_not_truncate_the_file
+      log = File.join(@tmpdir, 'truncate.log')
+      appender = Logging.appenders.file(NAME, filename: log, truncate: true)
 
-        lines = File.readlines(log, :encoding => 'UTF-8')
-        assert_equal "A normal line of text\n", lines[0]
-        assert_equal "ümlaut\n", lines[1]
+      appender << "This will be the first line\n"
+      appender << "This will be the second line\n"
+      appender << "This will be the third line\n"
+      appender.reopen
 
-        cleanup
+      File.open(log, 'r') do |file|
+        assert_equal "This will be the first line\n", file.readline
+        assert_equal "This will be the second line\n", file.readline
+        assert_equal "This will be the third line\n", file.readline
+        assert_raise(EOFError) {file.readline}
       end
+
+      cleanup
     end
 
   private
@@ -127,7 +143,6 @@
         Logging.appenders[NAME] = nil
       end
     end
-
   end  # TestFile
 
 end  # TestAppenders
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/appenders/test_rolling_file.rb 
new/test/appenders/test_rolling_file.rb
--- old/test/appenders/test_rolling_file.rb     2017-04-12 01:17:14.000000000 
+0200
+++ new/test/appenders/test_rolling_file.rb     2020-07-05 00:22:10.000000000 
+0200
@@ -13,9 +13,9 @@
       super
       Logging.init
 
-      @fn = File.expand_path('test.log', TMP)
-      @fn_fmt = File.expand_path('test.%d.log', TMP)
-      @glob = File.expand_path('*.log', TMP)
+      @fn = File.expand_path('test.log', @tmpdir)
+      @fn_fmt = File.expand_path('test.%d.log', @tmpdir)
+      @glob = File.expand_path('*.log', @tmpdir)
     end
 
     def test_factory_method_validates_input
@@ -93,8 +93,8 @@
     end
 
     def test_age
-      d_glob = File.join(TMP, 'test.*.log')
-      dt_glob = File.join(TMP, 'test.*-*.log')
+      d_glob = File.join(@tmpdir, 'test.*.log')
+      dt_glob = File.join(@tmpdir, 'test.*-*.log')
       age_fn = @fn + '.age'
 
       assert_equal [], Dir.glob(@glob)
@@ -205,7 +205,7 @@
 
       begin
         pwd = Dir.pwd
-        Dir.chdir TMP
+        Dir.chdir @tmpdir
 
         ap << 'X' * 100; ap.flush
         assert_equal 1, Dir.glob(@glob).length
@@ -249,9 +249,9 @@
     end
 
     def test_custom_numberd_filename
-      fn = File.expand_path('test.log{{.%d}}', TMP)
-      filename = File.expand_path('test.log', TMP)
-      glob = File.expand_path('test.log.*', TMP)
+      fn = File.expand_path('test.log{{.%d}}', @tmpdir)
+      filename = File.expand_path('test.log', @tmpdir)
+      glob = File.expand_path('test.log.*', @tmpdir)
 
       assert_equal [], Dir.glob(glob)
       ap = Logging.appenders.rolling_file(NAME, :filename => fn, :size => 100, 
:keep => 2)
@@ -285,10 +285,10 @@
     end
 
     def test_custom_timestamp_filename
-      fn = File.expand_path('test{{.%S:%M}}.log', TMP)
-      filename = File.expand_path('test.log', TMP)
+      fn = File.expand_path('test{{.%S:%M}}.log', @tmpdir)
+      filename = File.expand_path('test.log', @tmpdir)
       age_file = filename + '.age'
-      glob = File.expand_path('test.*.log', TMP)
+      glob = File.expand_path('test.*.log', @tmpdir)
 
       assert_equal [], Dir.glob(glob)
       ap = Logging.appenders.rolling_file(NAME, :filename => fn, :age => 1, 
:keep => 2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/layouts/test_json.rb 
new/test/layouts/test_json.rb
--- old/test/layouts/test_json.rb       2017-04-12 01:17:14.000000000 +0200
+++ new/test/layouts/test_json.rb       2020-07-05 00:22:10.000000000 +0200
@@ -78,7 +78,7 @@
                                     'log message', false)
       event.file = 'test_file.rb'
       event.line = 123
-      event.method = 'method_name'
+      event.method_name = 'method_name'
 
       @layout.items = %w[logger]
       assert_equal %Q[{"logger":"TestLogger"}\n], @layout.format(event)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/layouts/test_nested_exceptions.rb 
new/test/layouts/test_nested_exceptions.rb
--- old/test/layouts/test_nested_exceptions.rb  2017-04-12 01:17:14.000000000 
+0200
+++ new/test/layouts/test_nested_exceptions.rb  2020-07-05 00:22:10.000000000 
+0200
@@ -19,7 +19,7 @@
         end
 
         layout = Logging.layouts.basic({})
-        log = layout.format_obj(e)
+        log = layout.format_obj(err)
         assert_not_nil log.index('<StandardError> root exception')
 
         if err.respond_to?(:cause)
@@ -45,7 +45,7 @@
         end
 
         layout = Logging.layouts.basic(cause_depth: 1)
-        log = layout.format_obj(e)
+        log = layout.format_obj(err)
         assert_not_nil log.index('<StandardError> root exception')
 
         if err.respond_to?(:cause)
@@ -68,12 +68,12 @@
         end
 
         layout = Logging.layouts.parseable.new
-        log = layout.format_obj(e)
+        log = layout.format_obj(err)
         assert_equal 'StandardError', log[:class]
         assert_equal 'root exception', log[:message]
         assert log[:backtrace].size > 0
 
-        if e.respond_to?(:cause)
+        if err.respond_to?(:cause)
           assert_not_nil log[:cause]
 
           log = log[:cause]
@@ -101,13 +101,13 @@
         end
 
         layout = Logging.layouts.parseable.new(cause_depth: 1)
-        log = layout.format_obj(e)
+        log = layout.format_obj(err)
 
         assert_equal 'StandardError', log[:class]
         assert_equal 'root exception', log[:message]
         assert log[:backtrace].size > 0
 
-        if e.respond_to?(:cause)
+        if err.respond_to?(:cause)
           assert_not_nil log[:cause]
 
           log = log[:cause]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/layouts/test_pattern.rb 
new/test/layouts/test_pattern.rb
--- old/test/layouts/test_pattern.rb    2017-04-12 01:17:14.000000000 +0200
+++ new/test/layouts/test_pattern.rb    2020-07-05 00:22:10.000000000 +0200
@@ -105,7 +105,7 @@
                                     'log message', false)
       event.file = 'test_file.rb'
       event.line = '123'
-      event.method = 'method_name'
+      event.method_name = 'method_name'
 
       @layout.pattern = '%c'
       assert_equal 'TestLogger', @layout.format(event)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/layouts/test_yaml.rb 
new/test/layouts/test_yaml.rb
--- old/test/layouts/test_yaml.rb       2017-04-12 01:17:14.000000000 +0200
+++ new/test/layouts/test_yaml.rb       2020-07-05 00:22:10.000000000 +0200
@@ -68,7 +68,7 @@
                                     'log message', false)
       event.file = 'test_file.rb'
       event.line = 123
-      event.method = 'method_name'
+      event.method_name = 'method_name'
 
       @layout.items = %w[logger]
       assert_match %r/\A--- ?\nlogger: TestLogger\n/, @layout.format(event)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/setup.rb new/test/setup.rb
--- old/test/setup.rb   2017-04-12 01:17:14.000000000 +0200
+++ new/test/setup.rb   2020-07-05 00:22:10.000000000 +0200
@@ -5,6 +5,12 @@
 
 require "rubygems"
 require "test/unit"
+require "tmpdir"
+
+LOGGING_TEST_TMPDIR = Dir.mktmpdir("logging")
+Test::Unit.at_exit do
+  FileUtils.remove_entry(LOGGING_TEST_TMPDIR)
+end
 
 if Test::Unit::TestCase.respond_to? :test_order=
   Test::Unit::TestCase.test_order = :random
@@ -15,18 +21,16 @@
 module TestLogging
   module LoggingTestCase
 
-    TMP = 'tmp'
-
     def setup
       super
       Logging.reset
-      FileUtils.rm_rf TMP
-      FileUtils.mkdir TMP
+      @tmpdir = LOGGING_TEST_TMPDIR
+      FileUtils.rm_rf(Dir.glob(File.join(@tmpdir, "*")))
     end
 
     def teardown
       super
-      FileUtils.rm_rf TMP
+      FileUtils.rm_rf(Dir.glob(File.join(@tmpdir, "*")))
     end
   end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/test_log_event.rb new/test/test_log_event.rb
--- old/test/test_log_event.rb  2017-04-12 01:17:14.000000000 +0200
+++ new/test/test_log_event.rb  2020-07-05 00:22:10.000000000 +0200
@@ -68,12 +68,12 @@
       assert_equal 'MyLogger', @event.logger
     end
 
-    def test_method
+    def test_method_name
       assert_equal '', @event.file
 
       @logger.caller_tracing = true
       @logger.debug 'debug message'
-      assert_equal 'test_method', @appender.event.method
+      assert_equal 'test_method_name', @appender.event.method_name
     end
 
   end  # class TestLogEvent
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/test_logging.rb new/test/test_logging.rb
--- old/test/test_logging.rb    2017-04-12 01:17:14.000000000 +0200
+++ new/test/test_logging.rb    2020-07-05 00:22:10.000000000 +0200
@@ -11,8 +11,8 @@
       @levels = ::Logging::LEVELS
       @lnames = ::Logging::LNAMES
 
-      @fn = File.join(TMP, 'test.log')
-      @glob = File.join(TMP, '*.log')
+      @fn = File.join(@tmpdir, 'test.log')
+      @glob = File.join(@tmpdir, '*.log')
     end
 
     def test_backtrace
@@ -253,6 +253,31 @@
       assert_match %r/\d+\.\d+\.\d+/, ::Logging.version
     end
 
-  end  # class TestLogging
-end  # module TestLogging
+    class Failer
+      class WriteError < StandardError ; end
+      def self.write(*args)
+        raise WriteError.new("Oh noooooo")
+      end
+    end
 
+    def test_error_handling
+      logger = ::Logging.logger Failer, 2, 100
+      logger.appenders.first.level = :debug
+
+      # No errors are raised by default
+      logger.fatal 'this is a debug message'
+      # Always reset the level; we disable appenders that raise by setting them
+      # to :off
+      logger.appenders.first.level = :debug
+
+      begin
+        Logging.raise_errors = true
+        assert_raises Failer::WriteError do
+          logger.fatal 'this fails because the file descriptor is closed'
+        end
+      ensure
+        Logging.raise_errors = false
+      end
+    end
+  end
+end


Reply via email to