class SemanticLogger::Base

Attributes

filter[RW]

Class name to be logged

name[RW]

Class name to be logged

Public Instance Methods

backtrace(thread: Thread.current, level: :warn, message: "Backtrace:", payload: nil, metric: nil, metric_amount: nil) click to toggle source

Log a thread backtrace

# File lib/semantic_logger/base.rb, line 127
def backtrace(thread: Thread.current,
              level: :warn,
              message: "Backtrace:",
              payload: nil,
              metric: nil,
              metric_amount: nil)

  log = Log.new(name, level)
  return false unless meets_log_level?(log)

  backtrace =
    if thread == Thread.current
      Utils.extract_backtrace(caller)
    else
      log.thread_name = thread.name
      log.tags        = (thread[:semantic_logger_tags] || []).clone
      log.named_tags  = (thread[:semantic_logger_named_tags] || {}).clone
      thread.backtrace
    end
  # TODO: Keep backtrace instead of transforming into a text message at this point
  # Maybe log_backtrace: true
  if backtrace
    message += "\n"
    message << backtrace.join("\n")
  end

  if log.assign(message:       message,
                backtrace:     backtrace,
                payload:       payload,
                metric:        metric,
                metric_amount: metric_amount) && !filtered?(log)
    self.log(log)
  else
    false
  end
end
benchmark(level, message, params = {}, &block)

Backward compatibility

Alias for: measure
level() click to toggle source

Returns the current log level if set, otherwise it returns the global default log level

# File lib/semantic_logger/base.rb, line 33
def level
  @level || SemanticLogger.default_level
end
level=(level) click to toggle source

Set the logging level for this logger

Note: This level is only for this particular instance. It does not override

the log level in any logging instance or the default log level
SemanticLogger.default_level

Must be one of the values in SemanticLogger::LEVELS, or nil if this logger instance should use the global default level

# File lib/semantic_logger/base.rb, line 20
def level=(level)
  if level.nil?
    # Use the global default level for this logger
    @level_index = nil
    @level       = nil
  else
    @level_index = Levels.index(level)
    @level       = Levels.level(@level_index)
  end
end
measure(level, message, params = {}) { |params| ... } click to toggle source

Dynamically supply the log level with every measurement call

# File lib/semantic_logger/base.rb, line 114
def measure(level, message, params = {}, &block)
  index = Levels.index(level)
  if level_index <= index
    measure_internal(level, index, message, params, &block)
  elsif block
    yield(params)
  end
end
Also aliased as: benchmark
tagged(*tags) { || ... } click to toggle source

Add the tags or named tags to the list of tags to log for this thread whilst the supplied block is active.

Returns result of block.

Tagged example:

SemanticLogger.tagged(12345, 'jack') do
  logger.debug('Hello World')
end

Named Tags (Hash) example:

SemanticLogger.tagged(tracking_number: 12345) do
  logger.debug('Hello World')
end

Notes:

  • Named tags are the recommended approach since the tag consists of a name value pair this is more useful than just a string value in the logs, or centralized logging system.

  • This method is slow when using multiple text tags since it needs to flatten the tags and remove empty elements to support Rails 4.

  • It is recommended to keep tags as a list without any empty values, or contain any child arrays. However, this api will convert:

    `logger.tagged([['first', nil], nil, ['more'], 'other'])`
    

    to:

    `logger.tagged('first', 'more', 'other')`
    
  • For better performance with clean tags, see `SemanticLogger.tagged`.

# File lib/semantic_logger/base.rb, line 189
def tagged(*tags, &block)
  # Allow named tags to be passed into the logger
  if tags.size == 1
    tag = tags[0]
    return yield if tag.nil? || tag == ""

    return tag.is_a?(Hash) ? SemanticLogger.named_tagged(tag, &block) : SemanticLogger.fast_tag(tag.to_s, &block)
  end

  # Need to flatten and reject empties to support calls from Rails 4
  new_tags = tags.flatten.collect(&:to_s).reject(&:empty?)
  SemanticLogger.tagged(*new_tags, &block)
end