module Log

Constants

FACILITIES
ROBOT_UA_FRAGMENTS
SEVERITIES

error - ошибки crit - исключения emerg - неперехваченные исключения

Public Class Methods

debug(subject = '', tags = '', data = {}) click to toggle source

Можно вызывать в сокращённой форме: Log.debug('Сообщение') Log.debug({a: 2, b: 5}) Log.debug(any_object)

# File lib/tracer_client/log.rb, line 33
def self.debug(subject = '', tags = '', data = {})
  if Hash === subject
    # передан только хэш с данными
    message(:debug, subject.inspect[0...40], '', subject, caller)
  elsif String === subject
    # передан только subject
    message(:debug, subject, tags, data, caller)
  else
    # переданы некие другие данные
    message(:debug, subject.inspect[0...40], '', {debug: subject}, caller)
  end
end
end_request() click to toggle source
# File lib/tracer_client/log.rb, line 23
def self.end_request
  Thread.current[:request_tags] = nil
  Tracer::Client.end_request
end
exception(exception, subject, tags = '', data = {}) click to toggle source
# File lib/tracer_client/log.rb, line 60
def self.exception(exception, subject, tags = '', data = {})
  if Rails.env.development?
    raise exception
  else
    exception_message(exception, :crit, subject, tags, data, exception.backtrace)
    exception
  end
end
exception_with_alert(exception, subject, tags = '', data = {}) click to toggle source
# File lib/tracer_client/log.rb, line 70
def self.exception_with_alert(exception, subject, tags = '', data = {})
  exception(exception, subject, tags, data.merge(with_alert: true))
end
on_raise(exception, backtrace) click to toggle source
# File lib/tracer_client/log.rb, line 75
def self.on_raise(exception, backtrace)
  if exception.with_log?
    exception_message(exception, :warn, '', 'raise', {with_alert: exception.with_alert?}, backtrace)
  end
end
start_request(current_user, request, params, session, do_log_request) click to toggle source
# File lib/tracer_client/log.rb, line 15
def self.start_request(current_user, request, params, session, do_log_request)
  Tracer::Client.start_request(current_user, request, params, session)

  info('HTTP запрос', 'http_request') if do_log_request

  Thread.current[:request_tags] = %w(robot) if request.headers['User-Agent'] =~ ROBOT_UA_FRAGMENTS
end
unhandled(exception) click to toggle source
# File lib/tracer_client/log.rb, line 82
def self.unhandled(exception)
  if exception.with_log? && !exception.logged?
    exception_message(exception, :emerg, '', 'unhandled', {with_alert: exception.with_alert?}, exception.backtrace)
  end
end

Private Class Methods

enabled_severity?(message_severity, configured_severity) click to toggle source
# File lib/tracer_client/log.rb, line 139
def self.enabled_severity?(message_severity, configured_severity)
  message_index = SEVERITIES.index(message_severity)
  configured_index = SEVERITIES.index(configured_severity.to_sym)
  message_index.nil? || configured_index.nil? || message_index >= configured_index
end
exception_message(exception, severity, subject, tags, data, backtrace) click to toggle source
# File lib/tracer_client/log.rb, line 121
def self.exception_message(exception, severity, subject, tags, data, backtrace)
  tags = (tags + ' ' + exception.tags).strip if exception.respond_to?(:tags)
  data.merge!(exception.data.except(:with_alert)) if exception.respond_to?(:data)
  data.merge!(exception: {
                  class:   exception.class.name,
                  message: exception.message
              })

  message(severity, subject, tags, data, backtrace)
  exception.mark_logged
end
get_backtrace(backtrace) click to toggle source
# File lib/tracer_client/log.rb, line 145
def self.get_backtrace(backtrace)
  locations = Rails.backtrace_cleaner.clean(backtrace || [])

  locations.map do |location|
    if location =~ /\A(.*):(\d+):\s*(?:in `(.*)')\z/
      {
          file:     $~[1],
          line:     $~[2],
          function: $~[3],
      }
    end
  end.compact
end
log?(severity) click to toggle source
# File lib/tracer_client/log.rb, line 134
def self.log?(severity)
  (Rails.env.production? && !ENV['NO_TRACER'].to_b || ENV['TRACER'].to_b) &&
    (Settings.log.severity_level.nil? || enabled_severity?(severity, Settings.log.severity_level))
end
message(severity, subject, tags, data, backtrace) click to toggle source
# File lib/tracer_client/log.rb, line 92
def self.message(severity, subject, tags, data, backtrace)
  return unless log?(severity)

  tags = (Thread.current[:request_tags] || []) + tags.split(' ')

  data = {data: data} unless Hash === data

  return if data.key?(:exception) && data[:exception][:class] == 'ActiveRecord::RecordNotFound' && tags == %w(robot)

  error_hash = {
      severity:          severity,
      tags:              tags,
      message:           subject,
      backtrace: get_backtrace(backtrace).first(10)
  }

  if data.key?(:exception)
    error_hash[:exception_message] = data[:exception][:message].strip
    error_hash[:type]              = data[:exception][:class]
  end

  Tracer::Client.log(
      errors: [error_hash],
      data:       data.except(:exception, :with_alert),
      with_alert: data[:with_alert],
  )
end