Skip to Content Skip to Search

Active Support Proxy Logger ↑

The proxy logger, is a logger that forwards all received logs to another logger, but has its own independent severity level.

This is useful when you want some library you have no control over to use the same logger as the rest of your application, but to have a different severity level because it is logging too much:

SomeLibrary.logger = ActiveSupport::ProxyLogger.new(Rails.logger, :error)

It can also ignore individual messages matching given patterns, when a library is only noisy on some logs your application doesn’t care about:

SomeLibrary.logger = ActiveSupport::ProxyLogger.new(Rails.logger).ignore(/Noisy/)

Almost all of the standard Logger interface is supported.

Note that the proxy logger can only suppress some logs, if the proxy severity is lower than the severity of the proxied logger, the logs won’t be emitted.

Methods
#
A
C
D
E
F
I
L
N
R
U
W
Included Modules

Class Public methods

new(logger, level = ::Logger::DEBUG)

# File activesupport/lib/active_support/proxy_logger.rb, line 36
def initialize(logger, level = ::Logger::DEBUG)
  super()
  @logger = logger
  @level = ::Logger::Severity.coerce(level)
  @ignored_patterns = []
  @ignored = nil
end

Instance Public methods

<<(msg)

Forward the given msg to the underlying logger with no formatting returns the number of characters written, or nil if the underlying logger is nil:

logger = ProxyLogger.new(Logger.new($stderr))
logger << 'My message.' # => 10

Output:

My message.
# File activesupport/lib/active_support/proxy_logger.rb, line 197
def <<(msg)
  if @logger
    @logger << msg
  end
end

add(severity, message = nil, progname = nil, &block)

Creates a log entry, which may or may not be written to the log, depending on the entry’s severity and on the log level.

Examples:

logger = ActiveSupport::ProxyLogger.new(Logger.new($stderr), :error)
logger.add(Logger::INFO, 'Will not show')
logger.add(Logger::ERROR, 'No good')
logger.add(Logger::ERROR, 'No good', 'gnum')

Output:

E, [2022-05-12T16:25:55.349414 #36328] ERROR -- mung: No good
E, [2022-05-12T16:26:35.841134 #36328] ERROR -- gnum: No good

These convenience methods have implicit severity:

Also aliased as: log
# File activesupport/lib/active_support/proxy_logger.rb, line 159
def add(severity, message = nil, progname = nil, &block)
  severity ||= UNKNOWN
  return true unless @logger && severity >= level

  if @ignored
    if message.nil?
      if block_given?
        message = yield
        block = nil
      else
        message = progname
        progname = nil
      end
    end

    text = message.to_s
    return true if text.valid_encoding? && @ignored.match?(text)
  end

  @logger.add(severity, message, progname, &block)
end

close()

Closes the logger; returns nil: Further logs won’t be emitted.

# File activesupport/lib/active_support/proxy_logger.rb, line 87
def close
  @logger = nil
end

debug(progname = nil, &block)

Equivalent to calling add with severity Logger::DEBUG.

# File activesupport/lib/active_support/proxy_logger.rb, line 204
def debug(progname = nil, &block)
  add(DEBUG, nil, progname, &block)
end

debug!()

Sets the log level to Logger::DEBUG.

# File activesupport/lib/active_support/proxy_logger.rb, line 101
def debug!; self.level = DEBUG; end

debug?()

Returns true if the log level allows entries with severity Logger::DEBUG to be written, false otherwise.

# File activesupport/lib/active_support/proxy_logger.rb, line 98
def debug?; level <= DEBUG; end

error(progname = nil, &block)

Equivalent to calling add with severity Logger::ERROR.

# File activesupport/lib/active_support/proxy_logger.rb, line 221
def error(progname = nil, &block)
  add(ERROR, nil, progname, &block)
end

error!()

Sets the log level to Logger::ERROR.

# File activesupport/lib/active_support/proxy_logger.rb, line 122
def error!; self.level = ERROR; end

error?()

Returns true if the log level allows entries with severity Logger::ERROR to be written, false otherwise.

# File activesupport/lib/active_support/proxy_logger.rb, line 119
def error?; level <= ERROR; end

fatal(progname = nil, &block)

Equivalent to calling add with severity Logger::FATAL.

# File activesupport/lib/active_support/proxy_logger.rb, line 227
def fatal(progname = nil, &block)
  add(FATAL, nil, progname, &block)
end

fatal!()

Sets the log level to Logger::FATAL.

# File activesupport/lib/active_support/proxy_logger.rb, line 129
def fatal!; self.level = FATAL; end

fatal?()

Returns true if the log level allows entries with severity Logger::FATAL to be written, false otherwise.

# File activesupport/lib/active_support/proxy_logger.rb, line 126
def fatal?; level <= FATAL; end

ignore(*patterns)

Registers patterns of messages to ignore. Ignored messages aren’t forwarded to the underlying logger, whatever their severity. Returns self, so it can be chained on the constructor.

Regexps are matched against the message, strings are matched literally:

logger.ignore(/Noisy/, 'Also noisy')
logger.error('Noisy message') # not forwarded
logger.error('Also noisy')    # not forwarded

Patterns are matched against message.to_s, so lazily generated messages are evaluated even when they end up ignored.

# File activesupport/lib/active_support/proxy_logger.rb, line 58
def ignore(*patterns)
  return self if patterns.empty?

  @ignored_patterns.concat(patterns)
  @ignored = Regexp.union(@ignored_patterns)
  self
end

info(progname = nil, &block)

Equivalent to calling add with severity Logger::INFO.

# File activesupport/lib/active_support/proxy_logger.rb, line 209
def info(progname = nil, &block)
  add(INFO, nil, progname, &block)
end

info!()

Sets the log level to Logger::INFO.

# File activesupport/lib/active_support/proxy_logger.rb, line 108
def info!; self.level = INFO; end

info?()

Returns true if the log level allows entries with severity Logger::INFO to be written, false otherwise.

# File activesupport/lib/active_support/proxy_logger.rb, line 105
def info?; level <= INFO; end

level()

Logging severity threshold (e.g. Logger::INFO).

# File activesupport/lib/active_support/proxy_logger.rb, line 67
def level
  local_level || @level
end

level=(severity)

Sets the log level; returns severity.

Argument severity may be an integer, a string, or a symbol:

logger.level = Logger::ERROR # => 3
logger.level = 3             # => 3
logger.level = 'error'       # => "error"
logger.level = :error        # => :error
# File activesupport/lib/active_support/proxy_logger.rb, line 81
def level=(severity)
  @level = ::Logger::Severity.coerce(severity)
end

log(severity, message = nil, progname = nil, &block)

Alias for: add

reopen(logger)

Change the underlying logger.

# File activesupport/lib/active_support/proxy_logger.rb, line 92
def reopen(logger)
  @logger = logger
end

unknown(progname = nil, &block)

Equivalent to calling add with severity Logger::UNKNOWN.

# File activesupport/lib/active_support/proxy_logger.rb, line 233
def unknown(progname = nil, &block)
  add(UNKNOWN, nil, progname, &block)
end

warn(progname = nil, &block)

Equivalent to calling add with severity Logger::WARN.

# File activesupport/lib/active_support/proxy_logger.rb, line 215
def warn(progname = nil, &block)
  add(WARN, nil, progname, &block)
end

warn!()

Sets the log level to Logger::WARN.

# File activesupport/lib/active_support/proxy_logger.rb, line 115
def warn!; self.level = WARN; end

warn?()

Returns true if the log level allows entries with severity Logger::WARN to be written, false otherwise.

# File activesupport/lib/active_support/proxy_logger.rb, line 112
def warn?; level <= WARN; end