From 0bb650169e37b8f47c4b87352b7153a396c8ec9d Mon Sep 17 00:00:00 2001 From: Alex Reisner <alex@alexreisner.com> Date: Mon, 7 Sep 2015 17:34:16 -0400 Subject: [PATCH] Add kernel logger. Not pretty, but it fixes out-of-the-box verbosity issues (see GH #881). --- lib/geocoder.rb | 1 + lib/geocoder/configuration.rb | 4 +++- lib/geocoder/kernel_logger.rb | 25 +++++++++++++++++++++++++ lib/geocoder/logger.rb | 34 +++++++++++++--------------------- test/unit/logger_test.rb | 24 ++++++++++++++++++++++-- 5 files changed, 64 insertions(+), 24 deletions(-) create mode 100644 lib/geocoder/kernel_logger.rb diff --git a/lib/geocoder.rb b/lib/geocoder.rb index 8c4d2b8c..4f88cd82 100644 --- a/lib/geocoder.rb +++ b/lib/geocoder.rb @@ -1,5 +1,6 @@ require "geocoder/configuration" require "geocoder/logger" +require "geocoder/kernel_logger" require "geocoder/query" require "geocoder/calculations" require "geocoder/exceptions" diff --git a/lib/geocoder/configuration.rb b/lib/geocoder/configuration.rb index d706380f..5b898f7d 100644 --- a/lib/geocoder/configuration.rb +++ b/lib/geocoder/configuration.rb @@ -57,7 +57,8 @@ module Geocoder :units, :distances, :basic_auth, - :logger + :logger, + :kernel_logger_level ] attr_accessor :data @@ -100,6 +101,7 @@ module Geocoder @data[:cache_prefix] = "geocoder:" # prefix (string) to use for all cache keys @data[:basic_auth] = {} # user and password for basic auth ({:user => "user", :password => "password"}) @data[:logger] = :kernel # :kernel or Logger instance + @data[:kernel_logger_level] = ::Logger::WARN # log level, if kernel logger is used # exceptions that should not be rescued by default # (if you want to implement custom error handling); diff --git a/lib/geocoder/kernel_logger.rb b/lib/geocoder/kernel_logger.rb new file mode 100644 index 00000000..dc8a52ef --- /dev/null +++ b/lib/geocoder/kernel_logger.rb @@ -0,0 +1,25 @@ +module Geocoder + class KernelLogger + include Singleton + + def add(level, message) + return unless log_message_at_level?(level) + case level + when ::Logger::DEBUG, ::Logger::INFO + puts message + when ::Logger::WARN + warn message + when ::Logger::ERROR + raise message + when ::Logger::FATAL + fail message + end + end + + private # ---------------------------------------------------------------- + + def log_message_at_level?(level) + level >= Geocoder.config.kernel_logger_level + end + end +end diff --git a/lib/geocoder/logger.rb b/lib/geocoder/logger.rb index d4d2d98f..abc9fda0 100644 --- a/lib/geocoder/logger.rb +++ b/lib/geocoder/logger.rb @@ -18,14 +18,11 @@ module Geocoder } def log(level, message) - return nil unless valid_level?(level) - - logger = Geocoder.config[:logger] - - if logger == :kernel - kernel_log(level, message) - elsif logger.respond_to? :add - logger.add(SEVERITY[level], message) + unless valid_level?(level) + raise StandardError, "Geocoder tried to log a message with an invalid log level." + end + if current_logger.respond_to? :add + current_logger.add(SEVERITY[level], message) else raise Geocoder::ConfigurationError, "Please specify valid logger for Geocoder. " + "Logger specified must be :kernel or must respond to `add(level, message)`." @@ -33,23 +30,18 @@ module Geocoder nil end - private - - def kernel_log(level, message) - case level - when :debug, :info - puts message - when :warn - warn message - when :error - raise message - when :fatal - fail message + private # ---------------------------------------------------------------- + + def current_logger + logger = Geocoder.config[:logger] + if logger == :kernel + logger = Geocoder::KernelLogger.instance end + logger end def valid_level?(level) - [:debug, :info, :warn, :error, :fatal].include? level + SEVERITY.keys.include?(level) end end end diff --git a/test/unit/logger_test.rb b/test/unit/logger_test.rb index c6cf7f64..028374cb 100644 --- a/test/unit/logger_test.rb +++ b/test/unit/logger_test.rb @@ -21,12 +21,32 @@ class LoggerTest < GeocoderTestCase assert_equal "should log\n", @tempfile.read end - def test_set_logger_does_not_log_severity_too_low + def test_logger_does_not_log_severity_too_low @logger.level = Logger::ERROR - assert_equal nil, Geocoder.log(:info, "should not log") + Geocoder.log(:info, "should not log") assert_equal "", @tempfile.read end + def test_logger_logs_when_severity_high_enough + @logger.level = Logger::DEBUG + Geocoder.log(:warn, "important: should log!") + assert_match /important: should log/, @tempfile.read + end + + def test_kernel_logger_does_not_log_severity_too_low + assert_nothing_raised do + Geocoder.configure(logger: :kernel, kernel_logger_level: ::Logger::FATAL) + Geocoder.log(:info, "should not log") + end + end + + def test_kernel_logger_logs_when_severity_high_enough + assert_raises RuntimeError do + Geocoder.configure(logger: :kernel, kernel_logger_level: ::Logger::DEBUG) + Geocoder.log(:error, "important: should log!") + end + end + def test_raise_configruation_error_for_invalid_logger Geocoder.configure(logger: {}) assert_raises Geocoder::ConfigurationError do -- GitLab