diff --git a/lib/geocoder.rb b/lib/geocoder.rb
index 8c4d2b8ce5122ce19265e7a8891739619571f028..4f88cd82a55d0925d6746d1010cd6817c5020168 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 d706380fb2f41be642189f9493b3645d85467adc..5b898f7dc8e0692294943a30f62784290e6b2d47 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 0000000000000000000000000000000000000000..dc8a52ef4622dc2b26936aeaf432a5e2831e46e2
--- /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 d4d2d98ff30f0b1421ca523c93d227a3ebba7e80..abc9fda01e348a3fd9eb3ebdce6bbce365e84019 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 c6cf7f64c380ba42ae699fb562e62014469e555d..028374cbf81708f7fc54e8bff542091d361aa34f 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