Skip to content
Snippets Groups Projects
Commit 0bb65016 authored by Alex Reisner's avatar Alex Reisner
Browse files

Add kernel logger.

Not pretty, but it fixes out-of-the-box verbosity issues (see GH #881).
parent ee5ee852
No related branches found
No related tags found
No related merge requests found
require "geocoder/configuration"
require "geocoder/logger"
require "geocoder/kernel_logger"
require "geocoder/query"
require "geocoder/calculations"
require "geocoder/exceptions"
......
......@@ -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);
......
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
......@@ -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
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment