Module: Log

Defined in:
lib/tracer_client/log.rb

Constant Summary collapse

SEVERITIES =

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

i(debug info notice warn error crit alert emerg)
FACILITIES =
i(request lib auth user product order line_item delivery odkl email direct_mail page exception)
ROBOT_UA_FRAGMENTS =
/AhrefsBot|bingbot|DotBot|Googlebot|Mail.RU_Bot|MJ12bot|msnbot|SputnikBot|updown_tester|Web-Monitoring|WebMasterAid|YaDirectFetcher|Yahoo! Slurp|YandexBot/

Class Method Summary collapse

Class Method Details

.debug(subject = '', tags = '', data = {}) ⇒ Object

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



33
34
35
36
37
38
39
40
41
42
43
44
# 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

.enabled_severity?(message_severity, configured_severity) ⇒ Boolean

Returns:

  • (Boolean)


138
139
140
141
142
# File 'lib/tracer_client/log.rb', line 138

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

.end_requestObject



23
24
25
26
# 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 = {}) ⇒ Object



60
61
62
63
64
65
66
67
# 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_message(exception, severity, subject, tags, data, backtrace) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
# 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

.exception_with_alert(exception, subject, tags = '', data = {}) ⇒ Object



70
71
72
# 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

.get_backtrace(backtrace) ⇒ Object



144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/tracer_client/log.rb', line 144

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) ⇒ Boolean

Returns:

  • (Boolean)


134
135
136
# File 'lib/tracer_client/log.rb', line 134

def self.log?(severity)
  Settings.log.severity_level.nil? || enabled_severity?(severity, Settings.log.severity_level)
end

.message(severity, subject, tags, data, backtrace) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# 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

.on_raise(exception, backtrace) ⇒ Object



75
76
77
78
79
# 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) ⇒ Object



15
16
17
18
19
20
21
# 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) ⇒ Object



82
83
84
85
86
# 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