summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThom May <thom@may.lt>2016-08-03 17:25:27 +0100
committerGitHub <noreply@github.com>2016-08-03 17:25:27 +0100
commit812b0cd4a8b205922234d733c68ccdc051c3c671 (patch)
tree8f73c921e78ca4053a13b7e37ee10d91588af94e
parente16d10faa2821fa7c0bdebb64a5fa556354878e3 (diff)
parent833e12b45c7984a8f9162ee1dd4bb4d24f954016 (diff)
downloadmixlib-log-812b0cd4a8b205922234d733c68ccdc051c3c671.tar.gz
Merge pull request #13 from mhorbul/close-on-reset
File log devices opened by mixlib-log should be closed.
-rw-r--r--lib/mixlib/log.rb26
-rw-r--r--spec/mixlib/log_spec.rb32
2 files changed, 58 insertions, 0 deletions
diff --git a/lib/mixlib/log.rb b/lib/mixlib/log.rb
index 5f216f9..5ec1ba0 100644
--- a/lib/mixlib/log.rb
+++ b/lib/mixlib/log.rb
@@ -29,6 +29,7 @@ module Mixlib
LEVEL_NAMES = LEVELS.invert.freeze
def reset!
+ close!
@logger, @loggers = nil, nil
end
@@ -156,5 +157,30 @@ module Mixlib
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
diff --git a/spec/mixlib/log_spec.rb b/spec/mixlib/log_spec.rb
index 22b3758..5c56a8d 100644
--- a/spec/mixlib/log_spec.rb
+++ b/spec/mixlib/log_spec.rb
@@ -146,8 +146,40 @@ describe Mixlib::Log do
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