diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/services/logger_service.rb b/packages/forest_admin_agent/lib/forest_admin_agent/services/logger_service.rb index da84b42d4..3b28a2e4d 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/services/logger_service.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/services/logger_service.rb @@ -9,13 +9,16 @@ class LoggerService 'Info' => Logger::INFO, 'Debug' => Logger::DEBUG, 'Warn' => Logger::WARN, - 'Error' => Logger::ERROR + 'Error' => Logger::ERROR, + 'Fatal' => Logger::FATAL, + 'Unknown' => Logger::UNKNOWN }.freeze def initialize(logger_level = 'Info', logger = nil) @logger_level = logger_level @logger = logger @default_logger = MonoLogger.new($stdout) + @default_logger.level = get_level(@logger_level) || Logger::INFO end def log(level, message) @@ -28,7 +31,7 @@ def log(level, message) end def get_level(level) - LEVELS[level] + LEVELS[level.to_s.capitalize] end end end diff --git a/packages/forest_admin_agent/spec/lib/forest_admin_agent/services/logger_service_spec.rb b/packages/forest_admin_agent/spec/lib/forest_admin_agent/services/logger_service_spec.rb new file mode 100644 index 000000000..9cc6d6837 --- /dev/null +++ b/packages/forest_admin_agent/spec/lib/forest_admin_agent/services/logger_service_spec.rb @@ -0,0 +1,68 @@ +require 'spec_helper' + +module ForestAdminAgent + module Services + describe LoggerService do + describe 'default logger level' do + it 'defaults to Info' do + service = described_class.new + + expect(service.default_logger.level).to eq(Logger::INFO) + end + + it 'applies the configured level to the default logger' do + service = described_class.new('Warn') + + expect(service.default_logger.level).to eq(Logger::WARN) + end + + it 'is case-insensitive, so the config-style lowercase levels work too' do + service = described_class.new('debug') + + expect(service.default_logger.level).to eq(Logger::DEBUG) + end + + it 'falls back to Info when given an unknown level' do + service = described_class.new('nonsense') + + expect(service.default_logger.level).to eq(Logger::INFO) + end + + it 'supports Fatal, the quietest level' do + service = described_class.new('Fatal') + + expect(service.default_logger.level).to eq(Logger::FATAL) + end + + it 'supports Unknown' do + service = described_class.new('Unknown') + + expect(service.default_logger.level).to eq(Logger::UNKNOWN) + end + end + + describe '#log' do + it 'filters out messages below the configured level on the default logger' do + # MonoLogger captures the $stdout object at construction time, so the service + # has to be built inside the block for RSpec's stdout swap to reach its writes. + expect do + described_class.new('Warn').log('Info', 'hidden') + end.not_to output(/hidden/).to_stdout + end + + it 'still emits messages at or above the configured level' do + expect do + described_class.new('Warn').log('Warn', 'shown') + end.to output(/shown/).to_stdout + end + + it 'delegates to a custom logger regardless of logger_level' do + custom_logger = 'proc { |severity, message| $stdout.puts "custom:#{severity}:#{message}" }' # rubocop:disable Lint/InterpolationCheck + service = described_class.new('Error', custom_logger) + + expect { service.log('Info', 'hello') }.to output(/custom:1:hello/).to_stdout + end + end + end + end +end