lib/ougai/logging.rb
# frozen_string_literal: true
module Ougai
# Common Logging features
module Logging
attr_accessor :with_fields
attr_writer :before_log
module Severity
include ::Logger::Severity
TRACE = -1
SEV_LABEL = %w(TRACE DEBUG INFO WARN ERROR FATAL UNKNOWN)
def to_label(severity)
SEV_LABEL[severity + 1] || 'ANY'
end
def from_label(severity)
SEV_LABEL.index(severity) - 1
rescue
raise ArgumentError, "invalid log level: #{severity}"
end
end
include Severity
# Log any one or more of a message, an exception and structured data as TRACE.
# @return [Boolean] true
# @see Logging#debug
def trace(message = nil, ex = nil, data = nil, &block)
_log(TRACE, message, ex, data, &block)
end
# Log any one or more of a message, an exception and structured data as DEBUG.
# If the block is given for delay evaluation, it returns them as an array or the one of them as a value.
# @param message [String] The message to log. Use default_message if not specified.
# @param ex [Exception] The exception or the error
# @param data [Object] Any structured data
# @yieldreturn [String|Exception|Object|Array] Any one or more of former parameters
# @return [Boolean] true
def debug(message = nil, ex = nil, data = nil, &block)
_log(DEBUG, message, ex, data, &block)
end
# Log any one or more of a message, an exception and structured data as INFO.
# @return [Boolean] true
# @see Logging#debug
def info(message = nil, ex = nil, data = nil, &block)
_log(INFO, message, ex, data, &block)
end
# Log any one or more of a message, an exception and structured data as WARN.
# @return [Boolean] true
# @see Logging#debug
def warn(message = nil, ex = nil, data = nil, &block)
_log(WARN, message, ex, data, &block)
end
# Log any one or more of a message, an exception and structured data as ERROR.
# @return [Boolean] true
# @see Logging#debug
def error(message = nil, ex = nil, data = nil, &block)
_log(ERROR, message, ex, data, &block)
end
# Log any one or more of a message, an exception and structured data as FATAL.
# @return [Boolean] true
# @see Logging#debug
def fatal(message = nil, ex = nil, data = nil, &block)
_log(FATAL, message, ex, data, &block)
end
# Log any one or more of a message, an exception and structured data as UNKNOWN.
# @return [Boolean] true
# @see Logging#debug
def unknown(message = nil, ex = nil, data = nil, &block)
_log(UNKNOWN, message, ex, data, &block)
end
# Whether the current severity level allows for logging TRACE.
# @return [Boolean] true if allows
def trace?
level <= TRACE
end
# Log any one or more of a message, an exception and structured data as specified log level.
# If the block is given for delay evaluation, it returns them as an array or the one of them as a value.
# @param severity [Integer] The log level.
# @param message [String] The message to log. Use default_message if not specified.
# @param ex [Exception] The exception or the error
# @param data [Object] Any structured data
# @yieldreturn [String|Exception|Object|Array] Any one or more of former parameters
# @return [Boolean] true
def add(severity, message = nil, ex = nil, data = nil, &block)
_log(severity, message, ex, data, &block)
end
alias log add
def _log(severity, *args)
severity ||= UNKNOWN
return true if level > severity
append(severity, block_given? ? yield : args)
end
# @private
def chain(_severity, _args, _fields, _hooks)
raise NotImplementedError
end
protected
# @private
def append(severity, args)
raise NotImplementedError
end
# @private
def weak_merge!(base_data, inferior_data)
base_data.merge!(inferior_data) do |_, base_v, inferior_v|
if base_v.is_a?(Array) and inferior_v.is_a?(Array)
(inferior_v + base_v).uniq
elsif base_v.is_a?(Hash) and inferior_v.is_a?(Hash)
weak_merge!(base_v, inferior_v)
else
base_v
end
end
end
end
end