Skip to content

Commit

Permalink
lib/logger.rb: Add Logger#reopen
Browse files Browse the repository at this point in the history
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52620 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
sonots committed Nov 17, 2015
1 parent 6a533a3 commit f952570
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 6 deletions.
4 changes: 4 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand Down
53 changes: 47 additions & 6 deletions lib/logger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,26 @@ def initialize(logdev, shift_age = 0, shift_size = 1048576)
end
end

#
# :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) { ... }
Expand Down Expand Up @@ -580,12 +600,8 @@ class LogDeviceMutex
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)
Expand Down Expand Up @@ -623,8 +639,33 @@ def close
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))
Expand Down
66 changes: 66 additions & 0 deletions test/logger/test_logdevice.rb
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,72 @@ def test_close
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
Expand Down
6 changes: 6 additions & 0 deletions test/logger/test_logger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,12 @@ def test_initialize
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"
Expand Down

0 comments on commit f952570

Please sign in to comment.