aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsonots <sonots@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-11-17 13:58:57 +0000
committersonots <sonots@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-11-17 13:58:57 +0000
commitf952570bddc07e87b7c5a3f62dd5fbe390b7fe48 (patch)
treed1a0325bbead7687c7955aca6173ffb29d59a247
parent6a533a3ecc23e6cb90e2616231f2b67d15ff3239 (diff)
downloadruby-f952570bddc07e87b7c5a3f62dd5fbe390b7fe48.tar.gz
lib/logger.rb: Add Logger#reopen
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52620 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--NEWS3
-rw-r--r--lib/logger.rb53
-rw-r--r--test/logger/test_logdevice.rb66
-rw-r--r--test/logger/test_logger.rb6
5 files changed, 126 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 54dd631a64..df605e451e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -121,6 +121,10 @@ Mon Nov 16 21:27:54 2015 Naohisa Goto <ngotogenome@gmail.com>
* test/dtrace/helper.rb (Dtrace::TestCase#trap_probe): dtrace buffer
size is set as 8m on Solaris (default 4m). [Bug #11697]
+Mon Nov 16 20:03:14 2015 Naotoshi Seo <sonots@gmail.com>
+
+ * lib/logger.rb: Add Logger#reopen
+
Mon Nov 16 18:21:52 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* object.c (rb_obj_dig): dig in nested structs too.
diff --git a/NEWS b/NEWS
index d0ee63f420..f3bbce4d2c 100644
--- a/NEWS
+++ b/NEWS
@@ -77,6 +77,9 @@ with all sufficient information, see the ChangeLog file.
* Kernel#loop, when stopped by a StopIteration exception, returns
what the enumerator has returned instead of nil. [Feature #11498]
+* Logger
+ * Logger#reopen is added to reopen a log device. [Feature #11696]
+
* Module
* Module#deprecate_constant [Feature #11398]
diff --git a/lib/logger.rb b/lib/logger.rb
index f15a85077e..475ec2a9bf 100644
--- a/lib/logger.rb
+++ b/lib/logger.rb
@@ -322,6 +322,26 @@ class Logger
#
# :call-seq:
+ # Logger#reopen
+ # Logger#reopen(logdev)
+ #
+ # === Args
+ #
+ # +logdev+::
+ # The log device. This is a filename (String) or IO object (typically
+ # +STDOUT+, +STDERR+, or an open file).
+ #
+ # === Description
+ #
+ # Reopen a log device.
+ #
+ def reopen(logdev = nil)
+ @logdev.reopen(logdev)
+ self
+ end
+
+ #
+ # :call-seq:
# Logger#add(severity, message = nil, progname = nil) { ... }
#
# === Args
@@ -580,12 +600,8 @@ private
def initialize(log = nil, opt = {})
@dev = @filename = @shift_age = @shift_size = nil
@mutex = LogDeviceMutex.new
- if log.respond_to?(:write) and log.respond_to?(:close)
- @dev = log
- else
- @dev = open_logfile(log)
- @dev.sync = true
- @filename = log
+ set_dev(log)
+ if @filename
@shift_age = opt[:shift_age] || 7
@shift_size = opt[:shift_size] || 1048576
@next_rotate_time = next_rotate_time(Time.now, @shift_age) unless @shift_age.is_a?(Integer)
@@ -623,8 +639,33 @@ private
end
end
+ def reopen(log = nil)
+ # reopen the same filename if no argument, do nothing for IO
+ log ||= @filename if @filename
+ if log
+ @mutex.synchronize do
+ if @filename and @dev
+ @dev.close rescue nil # close only file opened by Logger
+ @filename = nil
+ end
+ set_dev(log)
+ end
+ end
+ self
+ end
+
private
+ def set_dev(log)
+ if log.respond_to?(:write) and log.respond_to?(:close)
+ @dev = log
+ else
+ @dev = open_logfile(log)
+ @dev.sync = true
+ @filename = log
+ end
+ end
+
def open_logfile(filename)
begin
open(filename, (File::WRONLY | File::APPEND))
diff --git a/test/logger/test_logdevice.rb b/test/logger/test_logdevice.rb
index ff39ebde1e..6482e25adb 100644
--- a/test/logger/test_logdevice.rb
+++ b/test/logger/test_logdevice.rb
@@ -99,6 +99,72 @@ class TestLogDevice < Test::Unit::TestCase
r.close
end
+ def test_reopen_io
+ logdev = d(STDERR)
+ old_dev = logdev.dev
+ logdev.reopen
+ assert_equal(STDERR, logdev.dev)
+ assert(!old_dev.closed?)
+ end
+
+ def test_reopen_io_by_io
+ logdev = d(STDERR)
+ old_dev = logdev.dev
+ logdev.reopen(STDOUT)
+ assert_equal(STDOUT, logdev.dev)
+ assert(!old_dev.closed?)
+ end
+
+ def test_reopen_io_by_file
+ logdev = d(STDERR)
+ old_dev = logdev.dev
+ logdev.reopen(@filename)
+ begin
+ assert(File.exist?(@filename))
+ assert_equal(@filename, logdev.filename)
+ assert(!old_dev.closed?)
+ ensure
+ logdev.close
+ end
+ end
+
+ def test_reopen_file
+ logdev = d(@filename)
+ old_dev = logdev.dev
+ File.unlink(@filename) if File.exist?(@filename) # remove once, then reopen
+ logdev.reopen
+ begin
+ assert(File.exist?(@filename))
+ assert_equal(@filename, logdev.filename)
+ assert(old_dev.closed?)
+ ensure
+ logdev.close
+ end
+ end
+
+ def test_reopen_file_by_io
+ logdev = d(@filename)
+ old_dev = logdev.dev
+ logdev.reopen(STDOUT)
+ assert_equal(STDOUT, logdev.dev)
+ assert_nil(logdev.filename)
+ assert(old_dev.closed?)
+ end
+
+ def test_reopen_file_by_file
+ logdev = d(@filename)
+ old_dev = logdev.dev
+ File.unlink(@filename) if File.exist?(@filename) # remove once, then reopen
+ logdev.reopen(@filename)
+ begin
+ assert(File.exist?(@filename))
+ assert_equal(@filename, logdev.filename)
+ assert(old_dev.closed?)
+ ensure
+ logdev.close
+ end
+ end
+
def test_shifting_size
tmpfile = Tempfile.new([File.basename(__FILE__, '.*'), '_1.log'])
logfile = tmpfile.path
diff --git a/test/logger/test_logger.rb b/test/logger/test_logger.rb
index dc1a155b49..35f6cf9d0e 100644
--- a/test/logger/test_logger.rb
+++ b/test/logger/test_logger.rb
@@ -121,6 +121,12 @@ class TestLogger < Test::Unit::TestCase
assert_nil(logger.datetime_format)
end
+ def test_reopen
+ logger = Logger.new(STDERR)
+ logger.reopen(STDOUT)
+ assert_equal(STDOUT, logger.instance_variable_get(:@logdev).dev)
+ end
+
def test_add
logger = Logger.new(nil)
logger.progname = "my_progname"