diff options
author | Thom May <thom@may.lt> | 2016-08-03 17:25:27 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-03 17:25:27 +0100 |
commit | 812b0cd4a8b205922234d733c68ccdc051c3c671 (patch) | |
tree | 8f73c921e78ca4053a13b7e37ee10d91588af94e | |
parent | e16d10faa2821fa7c0bdebb64a5fa556354878e3 (diff) | |
parent | 833e12b45c7984a8f9162ee1dd4bb4d24f954016 (diff) | |
download | mixlib-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.rb | 26 | ||||
-rw-r--r-- | spec/mixlib/log_spec.rb | 32 |
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 |