Skip to content

Commit

Permalink
Merge pull request #13 from mhorbul/close-on-reset
Browse files Browse the repository at this point in the history
File log devices opened by mixlib-log should be closed.
  • Loading branch information
thommay committed Aug 3, 2016
2 parents e16d10f + 833e12b commit 812b0cd
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 0 deletions.
26 changes: 26 additions & 0 deletions lib/mixlib/log.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ module Log
LEVEL_NAMES = LEVELS.invert.freeze

def reset!
close!
@logger, @loggers = nil, nil
end

Expand Down Expand Up @@ -156,5 +157,30 @@ def logger_for(*opts)
end
end

def all_loggers
[@logger, *@loggers].uniq
end

# select all loggers with File log devices
def loggers_to_close
loggers_to_close = []
all_loggers.each do |logger|
# unfortunately Logger does not provide access to the logdev
# via public API. In order to reduce amount of impact and
# handle only File type log devices I had to use this method
# to get access to it.
next unless logdev = logger.instance_variable_get(:"@logdev")
loggers_to_close << logger if logdev.filename
end
loggers_to_close
end

def close!
# try to close all file loggers
loggers_to_close.each do |l|
l.close rescue nil
end
end

end
end
32 changes: 32 additions & 0 deletions spec/mixlib/log_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,40 @@ def #{method_name}(message)

it "should have by default a base log level of warn" do
logger_mock = Struct.new(:formatter, :level).new
expect(Logger).to receive(:new).and_return(logger_mock)
Logit.init
expect(Logit.level).to eq(:warn)
end

it "should close File logger" do
opened_files_count_before = 0
ObjectSpace.each_object(File) do |f|
opened_files_count_before += 1 unless f.closed?
end
Logit.init("/tmp/logger.log")
Logit.init("/tmp/logger.log")
Logit.init("/tmp/logger.log")
opened_files_count_after = 0
ObjectSpace.each_object(File) do |f|
opened_files_count_after += 1 unless f.closed?
end
expect(opened_files_count_after).to eq(opened_files_count_before + 1)
end

it "should not close IO logger" do
opened_files_count_before = 0
ObjectSpace.each_object(File) do |f|
opened_files_count_before += 1 unless f.closed?
end
file = File.open("/tmp/logger.log")
Logit.init(file)
Logit.init(file)
Logit.init(file)
opened_files_count_after = 0
ObjectSpace.each_object(File) do |f|
opened_files_count_after += 1 unless f.closed?
end
expect(opened_files_count_after).to eq(opened_files_count_before + 1)
end

end

0 comments on commit 812b0cd

Please sign in to comment.