diff --git a/Gemfile.lock b/Gemfile.lock index f06d00a..2215cb9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - contextual_logger (0.4.0) + contextual_logger (0.5.0) activesupport json diff --git a/contextual_logger.gemspec b/contextual_logger.gemspec index b06bed3..2f3093c 100644 --- a/contextual_logger.gemspec +++ b/contextual_logger.gemspec @@ -2,7 +2,7 @@ Gem::Specification.new do |spec| spec.name = 'contextual_logger' - spec.version = '0.4.0' + spec.version = '0.5.0' spec.license = 'MIT' spec.date = '2018-10-12' spec.summary = 'Add context to your logger' diff --git a/lib/contextual_logger.rb b/lib/contextual_logger.rb index 31775c9..4c580ec 100644 --- a/lib/contextual_logger.rb +++ b/lib/contextual_logger.rb @@ -9,6 +9,29 @@ class << self def new(logger) logger.extend(LoggerMixin) end + + def normalize_log_level(log_level) + if log_level.is_a?(Integer) && (Logger::Severity::DEBUG..Logger::Severity::UNKNOWN).include?(log_level) + log_level + else + case log_level.to_s.downcase + when 'debug' + Logger::Severity::DEBUG + when 'info' + Logger::Severity::INFO + when 'warn' + Logger::Severity::WARN + when 'error' + Logger::Severity::ERROR + when 'fatal' + Logger::Severity::FATAL + when 'unknown' + Logger::Severity::UNKNOWN + else + raise ArgumentError, "invalid log level: #{log_level.inspect}" + end + end + end end module LoggerMixin diff --git a/lib/contextual_logger/logger_with_context.rb b/lib/contextual_logger/logger_with_context.rb index 467100e..38623e0 100644 --- a/lib/contextual_logger/logger_with_context.rb +++ b/lib/contextual_logger/logger_with_context.rb @@ -22,27 +22,7 @@ def level end def level=(override_level) - @override_level = - if (Logger::Severity::DEBUG..Logger::Severity::UNKNOWN).include?(override_level) || override_level.nil? - override_level - else - case override_level.to_s.downcase - when 'debug' - Logger::Severity::DEBUG - when 'info' - Logger::Severity::INFO - when 'warn' - Logger::Severity::WARN - when 'error' - Logger::Severity::ERROR - when 'fatal' - Logger::Severity::FATAL - when 'unknown' - Logger::Severity::UNKNOWN - else - raise ArgumentError, "invalid log level: #{override_level.inspect}" - end - end + @override_level = (ContextualLogger.normalize_log_level(override_level) if override_level) end def write_entry_to_log(severity, timestamp, progname, message, context:) diff --git a/spec/lib/contextual_logger_spec.rb b/spec/lib/contextual_logger_spec.rb index f096a7e..d91f2e9 100644 --- a/spec/lib/contextual_logger_spec.rb +++ b/spec/lib/contextual_logger_spec.rb @@ -298,4 +298,57 @@ def expect_log_line_to_be_written(log_line) expect(log_stream.string).to match(/\{"message":"info message","severity":"INFO","timestamp":".*"\}/) end end + + LOG_LEVEL_STRINGS_TO_CONSTANTS = + { + "DEBUG" => Logger::Severity::DEBUG, + "INFO" => Logger::Severity::INFO, + "WARN" => Logger::Severity::WARN, + "ERROR" => Logger::Severity::ERROR, + "FATAL" => Logger::Severity::FATAL, + "UNKNOWN" => Logger::Severity::UNKNOWN + }.freeze + + describe 'module methods' do + describe "normalize_log_level" do + it "raises an exception on invalid values" do + [nil, "", "ABC", 3.5].each do |invalid_value| + expect { ContextualLogger.normalize_log_level(invalid_value) }.to raise_exception(ArgumentError, /invalid log level:/), invalid_value + end + end + + it "accepts Severity constants" do + LOG_LEVEL_STRINGS_TO_CONSTANTS.each do |_uppercase_string_level, constant_level| + expect(ContextualLogger.normalize_log_level(constant_level)).to eq(constant_level) + end + end + + it "accepts uppercase strings" do + LOG_LEVEL_STRINGS_TO_CONSTANTS.each do |uppercase_string_level, constant_level| + expect(ContextualLogger.normalize_log_level(uppercase_string_level)).to eq(constant_level) + end + end + + it "accepts uppercase symbols" do + LOG_LEVEL_STRINGS_TO_CONSTANTS.each do |uppercase_string_level, constant_level| + uppercase_symbol_level = uppercase_string_level.to_sym + expect(ContextualLogger.normalize_log_level(uppercase_symbol_level)).to eq(constant_level) + end + end + + it "accepts lowercase strings" do + LOG_LEVEL_STRINGS_TO_CONSTANTS.each do |uppercase_string_level, constant_level| + lowercase_string_level = uppercase_string_level.downcase + expect(ContextualLogger.normalize_log_level(lowercase_string_level)).to eq(constant_level) + end + end + + it "accepts lowercase symbols" do + LOG_LEVEL_STRINGS_TO_CONSTANTS.each do |uppercase_string_level, constant_level| + lowercase_symbol_level = uppercase_string_level.downcase.to_sym + expect(ContextualLogger.normalize_log_level(lowercase_symbol_level)).to eq(constant_level) + end + end + end + end end