Skip to content

config.logger_level is ignored by the built-in default logger #371

Description

@jreed-mt

Summary

ForestAdminRails.config.logger_level (and the equivalent logger_level passed to ForestAdminAgent::Services::LoggerService.new) has no effect when using the default logger. All levels — including Info and Debug — are printed regardless of the configured level.

Environment

  • forest_admin_agent 1.27.0
  • forest_admin_rails 1.30.2

Reproduction

# config/initializers/forest_admin_rails.rb
ForestAdminRails.configure do |config|
  config.logger_level = "Warn"
end

Then run any command that goes through the agent (e.g. bin/rails forest_admin:schema:generate):

[ForestAdmin] Starting schema generation...
I, [...] INFO -- : unknown type 'inet' for field named ...
I, [...] INFO -- : [ForestAdmin] Schema generated successfully at ...

INFO lines still appear, even though logger_level is "Warn".

Root cause

In forest_admin_agent/lib/forest_admin_agent/services/logger_service.rb:

def initialize(logger_level = 'Info', logger = nil)
  @logger_level = logger_level
  @logger = logger
  @default_logger = MonoLogger.new($stdout)
end

def log(level, message)
  if @logger
    eval(@logger).call(get_level(level), message)
  else
    @default_logger.add(get_level(level), message)
  end
  @logger || @default_logger
end
  • @logger_level is stored but never applied to @default_logger.
  • MonoLogger < Logger, and Logger's default @level is DEBUG (0), so @default_logger.add(severity, message) accepts every level.
  • @logger_level is effectively only consulted when the user supplies a custom config.logger (which is eval'd and expected to do its own filtering).

Result: on the default-logger code path, logger_level is a dead option.

Suggested fix

Apply the configured level to the default logger in initialize:

def initialize(logger_level = 'Info', logger = nil)
  @logger_level = logger_level
  @logger = logger
  @default_logger = MonoLogger.new($stdout)
  @default_logger.level = LEVELS.fetch(@logger_level, Logger::INFO)
end

Logger#add already respects @level, so this is enough to make the option behave as documented/expected. It also keeps behavior backward-compatible for the custom-logger path (that branch doesn't touch @default_logger).

Happy to open a PR if that would help.

Workaround

Prepend LoggerService and set the level manually:

ForestAdminAgent::Services::LoggerService.prepend(Module.new do
  def initialize(logger_level = "Warn", logger = nil)
    super
    normalized = @logger_level.to_s.capitalize
    @default_logger.level =
      ForestAdminAgent::Services::LoggerService::LEVELS.fetch(normalized, Logger::WARN)
  end
end)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions