alexreisner/geocoder · error · Geocoder::ConfigurationError

Please specify valid logger for Geocoder. Logger specified…

Error message

Please specify valid logger for Geocoder. Logger specified must be :kernel or must respond to `add(level, message)`.

What it means

Geocoder::ConfigurationError raised when the configured logger neither is :kernel nor responds to add(level, message). Geocoder requires a stdlib Logger-compatible object so it can write log entries through Logger#add.

Solutions

  1. Configure a ::Logger instance: Geocoder.configure(logger: Logger.new(STDOUT))
  2. Use logger: :kernel to log via Kernel (puts)
  3. Add an #add(level, message) method to your custom logger object
  4. Use Rails.logger, which responds to :add

Example fix

// before
Geocoder.configure(logger: MyLogger)  # class object, no #add
// after
Geocoder.configure(logger: Logger.new($stdout))
Defensive patterns

Strategy: type-guard

Validate before calling

raise unless logger == :kernel || logger.respond_to?(:add)

Type guard

def valid_geocoder_logger?(l); l == :kernel || l.respond_to?(:add); end

Try / catch

begin
  Geocoder.search(q)
rescue Geocoder::ConfigurationError => e
  Geocoder.configure(logger: Logger.new($stdout))
  retry
end

Prevention

When it happens

Trigger: Setting Geocoder.configure(logger: some_object) where some_object is a string, nil-with-invalid-config, a custom class without an #add method, or anything other than a Logger instance / :kernel.

Common situations: Passing Rails.logger before it is initialized, assigning a custom log wrapper that lacks #add, or configuring logger: :syslog expecting built-in support.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of alexreisner/geocoder@c10bd70121 (2026-09-15). Data as JSON: /api/errors/8cc7e8410edcfe8e. Report an issue: GitHub.

Appendix: source

Thrown at lib/geocoder/logger.rb:27

  class Logger
    include Singleton

    SEVERITY = {
      debug: ::Logger::DEBUG,
      info: ::Logger::INFO,
      warn: ::Logger::WARN,
      error: ::Logger::ERROR,
      fatal: ::Logger::FATAL
    }

    def log(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)`."
      end
      nil
    end

    private # ----------------------------------------------------------------

    def current_logger
      logger = Geocoder.config[:logger]
      if logger == :kernel
        logger = Geocoder::KernelLogger.instance
      end
      logger
    end

    def valid_level?(level)
      SEVERITY.keys.include?(level)
    end

View on GitHub (pinned to c10bd70121)