loggun 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a8a4d4015105e9d55b653cab3305ab2b1ddeeda0e1429bd5e2449c5841771fe
4
- data.tar.gz: e6a84389338458849f87dfb2ffcdea13403537553fa547b170c4debb5901f433
3
+ metadata.gz: 756771ea707f7cbaafd88da80dc72afd4311702718de31a087711b258f68d47a
4
+ data.tar.gz: b2a00e34692488e289888c9f3d7aa433fc30f66828a160762cf2fe80aa5ea46b
5
5
  SHA512:
6
- metadata.gz: f10eb810cb421dde460b1c97c777496447d22197dfdbf35bf6eae341a1b9b2a6270044135887a062882c0f8bf4ccc21efbfe3231598ee7f060ca5be220385a6f
7
- data.tar.gz: 3362704777d4d6814ba58e1a72aee945d5f1f8105d03ff20930e3ecd02d559d5878f90681a77aefd14231aef67dbb79b41cd1883a5cbc6e54a8fa3817c1a49c9
6
+ metadata.gz: c797ff8ce8de7a5e2da28b95c9e498c1f78b827e5596f0bf1923fe87a3c5376fa5eef46c9169208225c262dc58bc846f05f4d5eefaa11ef8bd75c7e76f7ea2ee
7
+ data.tar.gz: 94d4d7bc950a938e82ab17b76fd4e387a169b90f16adeae8199958876847905d28ce698ee47ef4fc17d34102c3e619796cc9e8e03b27dc67b55f36ec34af5f6b
data/README.md CHANGED
@@ -21,6 +21,23 @@ gem 'loggun'
21
21
  $ bundle
22
22
 
23
23
  ## Использование
24
+ Вы можете использовать Loggun как обертку для вашего Logger. Для этого необходимо передать
25
+ ему инстанс вашего логгера и настроить его formatter:
26
+ ```ruby
27
+ Loggun.logger = Rails.logger
28
+ Loggun.logger.formatter = Loggun::Formatter.new
29
+ ```
30
+
31
+ Теперь вы можете использовать Loggun для логгирования в стандартизированном формате:
32
+ ```ruby
33
+ Loggun.info('http_request.api.request', user_id: current_user.id)
34
+ #=> 2020-04-11T22:35:04.225+03:00 - 170715 INFO http_request.api.request - {"user_id": 5465}
35
+ ...
36
+ Loggun.info('http_request.api.response', user_id: current_user.id, success: true)
37
+ #=> 2020-04-11T22:35:04.225+03:00 - 170715 INFO http_request.api.response - {"user_id": 5465, "success": true}
38
+ ```
39
+
40
+ Подробнее об конфигурации и использовании Loggun ниже.
24
41
 
25
42
  ### Конфигурация
26
43
  Для успешной конфигурации гема необходимо подгружать файл при инициализации вашего приложения.
@@ -42,14 +59,12 @@ end
42
59
  ```
43
60
  Все настройки являются опциональными.
44
61
  #### Настройки
45
- `precision` - точность отметок времени. По умолчанию - `milliseconds`. Может принимать одно из следующих значений: `sec`, `seconds`, `ms`, `millis`, `milliseconds`, `us`, `micros`, `microseconds`, `ns`, `nanos`, `nanoseconds`
46
-
47
- `pattern` - шаблон для формата вывода данных в лог. Доступные ключи: `time`, `pid`, `severity`, `type`, `tags_text`, `message`, `parent_transaction`
48
-
49
- `parent_transaction_to_message` - признак необходимости добавлять значение `parent_transaction` в тело логируемого сообщения.
50
- Вне зависимости от данной настройки можно использовать ключ `parent_transaction` в шаблоне `pattern`.
51
-
52
- `modifiers` - модификаторы для переопределения формата логирования указанного компонента. См. далее.
62
+ - `precision` - точность отметок времени. По умолчанию - `milliseconds`. Может принимать одно из следующих значений: `sec`, `seconds`, `ms`, `millis`, `milliseconds`, `us`, `micros`, `microseconds`, `ns`, `nanos`, `nanoseconds`
63
+ - `pattern` - текстовый шаблон для формата вывода данных в лог.
64
+ Доступные ключи: `time`, `pid`, `severity`, `type`, `tags_text`, `message`, `parent_transaction`
65
+ - `parent_transaction_to_message` - признак необходимости добавлять значение `parent_transaction` в тело логируемого сообщения.
66
+ Вне зависимости от данной настройки можно использовать ключ `parent_transaction` в шаблоне `pattern`.
67
+ - `modifiers` - модификаторы для переопределения формата логирования указанного компонента. См. далее.
53
68
 
54
69
  #### Модификаторы
55
70
  Каждый модифкатор может быть активирован двумя равнозначными способами:
@@ -61,16 +76,43 @@ config.modifiers.rails = true
61
76
  config.modifiers.rails.enable = true
62
77
  ```
63
78
 
64
- `rails` - модифицирует форматирование логгера Rails.
79
+ ##### Rails модификатор
80
+ `config.modifier.rails` - модифицирует форматирование логгера Rails.
65
81
 
66
- `sidekiq` - модифицирует форматирование логгера Sidekiq.
82
+ ##### Active Record модификатор
83
+ `config.modifier.active_record` - добавляет (именно добавляет, а не модифицирует) нового подписчика на SQL события.
84
+ SQL начинает дополнительно логгироваться в Loggun формате, severity - info. Например:
85
+ ```text
86
+ 2020-04-12T20:08:52.913+03:00 - 487257 INFO storage.sql.query - {"sql":"SELECT 1","name":null,"duration":0.837}
87
+ ```
88
+ Пример настроек:
89
+ ```ruby
90
+ Loggun::Config.configure do |config|
91
+ #...
92
+ config.modifiers.active_record.enable = true
93
+ config.modifiers.active_record.log_subscriber_class_name = 'MyApp::MyLogSubscriber'
94
+ config.modifiers.active_record.payload_keys = %i[sql duration]
95
+ #...
96
+ end
97
+ ```
98
+ - `log_subscriber_class_name` - имя класса, реализующего логирование sql события.
99
+ Необходим метод `#sql`. По-умолчанию `::Loggun::Modifiers::ActiveRecord::LoggunLogSubscriber`
67
100
 
68
- `clockwork` - модифицирует форматирование логгера Clockwork.
101
+ - `payload_keys` - необходимые ключи в полезной нарзуке. Используется в дефолтном классе. Доступные
102
+ ключи: ```%i[sql name duration source]```.
69
103
 
70
- `outgoing_http` - добавляет логирование исходящих http запросов.
104
+ ##### Sidekiq модификатор
105
+ `config.modifiers.sidekiq` - модифицирует форматирование логгера Sidekiq.
106
+
107
+ ##### Clockwork модификатор
108
+ `config.modifiers.clockwork` - модифицирует форматирование логгера Clockwork.
109
+
110
+ ##### Модификатор исходящих HTTP запросово
111
+ `config.modifiers.outgoing_http` - добавляет логирование исходящих http запросов.
71
112
  На данный момент поддерживаются только запросы посредством гема `HTTP`.
72
113
 
73
- `incoming_http` - добавляет логирование входящих http запросов для контроллеров Rails.
114
+ ##### Модификатор входящих запросов в Rails
115
+ `config.modifiers.incoming_http` - добавляет логирование входящих http запросов для контроллеров Rails.
74
116
  Данный модификатор может иметь дополнительные настройки, которые устанавливаются следующим образом
75
117
  (приведены значения по умолчанию):
76
118
 
@@ -84,15 +126,14 @@ Loggun::Config.configure do |config|
84
126
  #...
85
127
  end
86
128
  ```
129
+ - `controllers` - массив имён базовых контроллеров, для которых необходимо добавить указанное логирование.
87
130
 
88
- `controllers` - массив имён базовых контроллеров, для которых необходимо добавить указанное логирование.
89
-
90
- `success_condition` - лямбда, определяющая, содержит ли успех ответ экшена. Например `-> { JSON.parse(response.body)['result'] == 'ok' }`
131
+ - `success_condition` - лямбда, определяющая, содержит ли успех ответ экшена. Например `-> { JSON.parse(response.body)['result'] == 'ok' }`
91
132
 
92
- `error_info` - лямбда, позволяющая добавить в лог информацию об ошибке, содержащейся в неуспешном ответе экшена.
133
+ - `error_info` - лямбда, позволяющая добавить в лог информацию об ошибке, содержащейся в неуспешном ответе экшена.
93
134
  Например `-> { JSON.parse(response.body)['error_code'] }`
94
135
 
95
- Для Rails 6 и выше данный модификатор может работать некорректно.
136
+ **Для Rails 6 и выше данный модификатор может работать некорректно.**
96
137
  В этом случае можно указать в требуемом базовом контроллере строку:
97
138
  ```ruby
98
139
  include Loggun::HttpHelpers
@@ -100,8 +141,9 @@ include Loggun::HttpHelpers
100
141
  Это делает настройки `enable` и `controllers` модификатора безсполезными,
101
142
  однако позволяет гарантированно логировать входящие http запросы.
102
143
 
103
- Настройки `success_condition` и `error_info` продолжают использоваться и могу быть установлены требуемым образом.
144
+ Настройки `success_condition` и `error_info` продолжают использоваться и могут быть установлены требуемым образом.
104
145
 
146
+ ##### Персональные модификаторы
105
147
  Помимо указанных модификаторов существует возможность добавить собственный.
106
148
  Необходимо уснаследовать его от `Loggun::Modifiers::Base` и указать в методе `apply` все необходимые действия.
107
149
  ```ruby
@@ -132,24 +174,35 @@ end
132
174
  class SomeClass
133
175
  include Loggun::Helpers
134
176
 
135
- log_options entity_action: :method_name, as_transaction: true
177
+ log_options entity_action: :method_name, as_transaction: true, only: %i[download_data]
136
178
 
137
- def some_action
138
- log_info 'type_for_action', 'Information'
139
- bar
140
- end
141
-
142
- def bar
143
- log_info 'type_for_bar', 'Bar information'
179
+ def download_data
180
+ log_info 'http_request', 'Information'
181
+ # ... make http request here
182
+ log_info 'http_response', success: true
144
183
  end
145
184
  end
146
185
  ```
147
- Даёт подобный вывод в лог:
186
+ При вызове `#download_data` мы получим следующий вывод в лог:
148
187
  ```
149
- 2020-03-04T16:58:38.207+05:00 - 28476 INFO type_for_action.some_class.some_action#msg_id_1583323118203 - {"value":["Information"]}
150
- 2020-03-04T16:58:38.208+05:00 - 28476 INFO type_for_bar.some_class.bar#msg_id_1583323118207 - {"value":["Bar information"],"parent_transaction":"class.geo_location__actual_location.fetch_input#msg_id_1583323118203"}
188
+ 2020-03-04T16:58:38.207+05:00 - 28476 INFO http_request.some_class.download_data#ffg5431_1583323118203 - {"message":["Information"]}
189
+ 2020-03-04T16:58:38.208+05:00 - 28476 INFO http_response.some_class.download_data#ffg5431_1583323118203 - {"success": true}
151
190
  ```
152
191
 
192
+ **Важно**, что с хелпером log_options необходимо использовать только методы вида `log_<severity>`.
193
+ Методы модуля `Loggun` не будут работать.
194
+
195
+ Список всех опций хелпера log_options:
196
+
197
+ - `entity_name` - имя сущности метода, string
198
+ - `entity_action` - действие сущности метода, string
199
+ - `as_transaction` - добавлять уникальный ID транзакции для метода, boolean
200
+ - `transaction_generator` - собственный генератор ID транзакции, lambda
201
+ - `log_all_methods` - признак необходимости применения хелпера ко всем методам, boolean
202
+ - `only` - список методов, для которых необходимо применить хелпер (работает только если `log_all_methods` - false), Array{Symbol}
203
+ - `except` - список методов, которые надо исключить для хелпера, Array{Symbol}
204
+ - `log_transaction_except` - список методов, логирование которых не нужно обогащать ID транзакции, Array{Symbol}
205
+
153
206
  ## License
154
207
 
155
208
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/lib/loggun/config.rb CHANGED
@@ -6,16 +6,20 @@ module Loggun
6
6
  include Singleton
7
7
 
8
8
  DEFAULTS = {
9
- pattern: '%{time} - %{pid} %{severity} %{type} %{tags_text}%{agent} %{message}',
9
+ pattern: '%{time} - %{pid} %{severity} %{type} %{tags_text} %{message}',
10
10
  parent_transaction_to_message: true,
11
11
  precision: :milliseconds,
12
12
  incoming_http: {
13
13
  controllers: %w[ApplicationController],
14
14
  success_condition: -> { response.code == '200' },
15
15
  error_info: -> { nil }
16
+ },
17
+ active_record: {
18
+ log_subscriber_class_name: '::Loggun::Modifiers::ActiveRecord::LoggunLogSubscriber',
19
+ payload_keys: %i[sql name duration source]
16
20
  }
17
21
  }.freeze
18
- DEFAULT_MODIFIERS = %i[rails sidekiq clockwork incoming_http outgoing_http].freeze
22
+ DEFAULT_MODIFIERS = %i[rails active_record sidekiq clockwork incoming_http outgoing_http].freeze
19
23
 
20
24
  attr_accessor(
21
25
  :formatter,
@@ -55,9 +59,9 @@ module Loggun
55
59
  instance.custom_modifiers.each(&:use)
56
60
  end
57
61
 
58
- def setup_formatter(app)
62
+ def setup_formatter(app, formatter = nil)
59
63
  Loggun.logger = app.logger
60
- Loggun.logger.formatter = instance.formatter
64
+ Loggun.logger.formatter = formatter || instance.formatter
61
65
  end
62
66
  end
63
67
 
@@ -5,7 +5,7 @@ module Loggun
5
5
  class Formatter
6
6
  DEFAULT_VALUE = '-'.freeze
7
7
 
8
- def call(severity, time, _program_name, message)
8
+ def call(severity, time, _program_name, message, loggun_type: nil)
9
9
  data = Hash.new(DEFAULT_VALUE)
10
10
  data[:time] = time.iso8601(config.timestamp_precision)
11
11
  data[:pid] = Process.pid
@@ -20,7 +20,7 @@ module Loggun
20
20
  data[:message] = message.to_s.tr("\r\n", ' ').strip
21
21
  data[:severity] = severity&.to_s || 'INFO'
22
22
  data[:tags_text] = tags_text
23
- data[:type] = Loggun.type || DEFAULT_VALUE.dup
23
+ data[:type] = loggun_type || Loggun.type || DEFAULT_VALUE.dup
24
24
  data[:transaction_id] = Loggun.transaction_id
25
25
  data[:parent_transaction] = parent_transaction if parent_transaction
26
26
 
@@ -3,53 +3,65 @@ require 'securerandom'
3
3
  module Loggun
4
4
  module Helpers
5
5
  SKIPPED_METHODS = %i[
6
- initialize loggun logger modified_methods
6
+ initialize loggun logger log_modified_methods loggun_init in_log_transaction with_log_type
7
7
  ].freeze
8
8
  DEFAULT_TYPE = 'class'.freeze
9
9
 
10
10
  def self.included(klass)
11
+ klass.extend(InitMethods)
12
+ klass.loggun_init
11
13
  klass.extend(ClassMethods)
12
- klass.init
13
14
  end
14
15
 
15
- module ClassMethods
16
+ module InitMethods
16
17
  attr_accessor(
17
18
  :with_log_transaction_id,
18
19
  :log_transaction_generator,
19
20
  :log_entity_name,
20
21
  :log_entity_action,
21
- :modified_methods,
22
- :generate_transaction_except
22
+ :log_modified_methods,
23
+ :log_skip_methods,
24
+ :log_only_methods,
25
+ :log_all_methods,
26
+ :log_transaction_except
23
27
  )
24
28
 
29
+ def loggun_init
30
+ @log_modified_methods = []
31
+ @log_all_methods = false
32
+ end
33
+ end
34
+
35
+ module ClassMethods
25
36
  def log_options(**options)
26
37
  @log_entity_name = options[:entity_name]
27
38
  @log_entity_action = options[:entity_action]
28
39
  @with_log_transaction_id = options[:as_transaction]
29
40
  @log_transaction_generator = options[:transaction_generator]
30
- @generate_transaction_except = options[:generate_transaction_except]&.map(&:to_sym)
31
- end
32
-
33
- def init
34
- @modified_methods = []
41
+ @log_transaction_except = options[:log_transaction_except]&.map(&:to_sym)
42
+ @log_skip_methods = options[:except]&.map(&:to_sym)
43
+ @log_only_methods = options[:only]&.map(&:to_sym)
44
+ @log_all_methods = options[:log_all_methods]
35
45
  end
36
46
 
37
47
  def method_added(method_name)
38
48
  super
39
- @modified_methods ||= []
40
- return if SKIPPED_METHODS.include?(method_name) ||
41
- modified_methods.include?(method_name)
49
+ @log_modified_methods ||= []
42
50
 
43
- modified_methods << method_name
51
+ return if !log_all_methods && !log_only_methods&.include?(method_name)
52
+ return if log_skip_methods&.include?(method_name)
53
+ return if SKIPPED_METHODS.include?(method_name) || log_modified_methods.include?(method_name)
54
+
55
+ log_modified_methods << method_name
44
56
  method = instance_method(method_name)
45
57
  undef_method(method_name)
46
58
 
47
59
  define_method(method_name) do |*args, &block|
48
- if self.class.generate_transaction_except&.include?(method_name.to_sym)
60
+ if self.class.log_transaction_except&.include?(method_name.to_sym)
49
61
  method.bind(self).call(*args, &block)
50
62
  else
51
63
  type = log_type(nil, method_name)
52
- in_transaction(type) do
64
+ in_log_transaction(type) do
53
65
  method.bind(self).call(*args, &block)
54
66
  end
55
67
  end
@@ -57,19 +69,15 @@ module Loggun
57
69
  end
58
70
  end
59
71
 
60
- %i[unknown fatal error warn info debug].each do |method|
61
- define_method("log_#{method}") do |*args, **attrs, &block|
72
+ %i[unknown fatal error warn info debug].each do |method_name|
73
+ define_method("log_#{method_name}") do |*args, **attrs, &block|
62
74
  type = args.shift
63
- next logger.send(method, type, &block) if args.empty? &&
64
- attrs.empty?
65
-
66
- method_name = caller_locations.first.label.split(' ').last
67
- type = log_type(type, method_name)
75
+ next logger.send(method_name, type, &block) if args.empty? && attrs.empty?
68
76
 
69
- if %i[fatal error].include?(method)
70
- methods = args.first.methods
71
- next unless methods.include?(:message) && methods.include?(:backtrace)
77
+ caller_method_name = caller_locations.first.label.split(' ').last
78
+ type = log_type(type, caller_method_name)
72
79
 
80
+ if %i[fatal error].include?(method_name) && %i[backtrace message].all? { |m| args.first.respond_to?(m) }
73
81
  error = args.shift
74
82
  attrs[:error] = { class: error.class, msg: error.message }
75
83
  if attrs[:hidden]
@@ -78,10 +86,10 @@ module Loggun
78
86
  attrs[:hidden] = { error: { backtrace: error.backtrace } }
79
87
  end
80
88
  end
81
- attrs[:value] = args unless args.empty?
89
+ attrs[:message] = args unless args.empty?
82
90
 
83
- with_type(type) do
84
- logger.send(method, **attrs, &block)
91
+ with_log_type(type) do
92
+ logger.send(method_name, **attrs, &block)
85
93
  end
86
94
  end
87
95
  end
@@ -98,7 +106,7 @@ module Loggun
98
106
  end
99
107
  end
100
108
 
101
- def in_transaction(current_type = nil, current_transaction_id = nil)
109
+ def in_log_transaction(current_type = nil, current_transaction_id = nil)
102
110
  current_transaction_id ||= generate_log_transaction_id
103
111
  previous_transaction_id = self.parent_transaction_id
104
112
  previous_type = self.parent_type
@@ -117,7 +125,7 @@ module Loggun
117
125
  self.parent_type = previous_type
118
126
  end
119
127
 
120
- def with_type(current_type)
128
+ def with_log_type(current_type)
121
129
  previous_type = self.type
122
130
  self.type = current_type
123
131
  yield
@@ -126,22 +134,20 @@ module Loggun
126
134
  end
127
135
 
128
136
  def log_type(type, method_name)
137
+ klass = self.class
129
138
  type ||= DEFAULT_TYPE.dup
130
139
  type_as_arr = type.split('.')
131
- klass = self.class
132
- log_entity_name = klass.log_entity_name if klass.respond_to?(:log_entity_name)
133
- log_entity_name ||= underscore(klass.name)
134
- type << ".#{log_entity_name}" if type_as_arr.size == 1
140
+
141
+ log_entity_name = klass.respond_to?(:log_entity_name) ? klass.log_entity_name : underscore(klass.name)
142
+ type_as_arr << log_entity_name if type_as_arr.size == 1
135
143
 
136
144
  return type unless klass.respond_to?(:log_entity_action)
137
145
 
138
- if klass.log_entity_action && type_as_arr.size < 3
139
- if klass.log_entity_action == :method_name && method_name
140
- type << ".#{method_name}"
141
- end
146
+ if klass.log_entity_action && klass.log_entity_action == :method_name && type_as_arr.size < 3 && method_name
147
+ type_as_arr << method_name
142
148
  end
143
149
 
144
- type
150
+ type_as_arr.join('.')
145
151
  end
146
152
 
147
153
  private
@@ -163,7 +169,6 @@ module Loggun
163
169
  end
164
170
 
165
171
  def generate_log_transaction_id
166
- return unless self.class.with_log_transaction_id
167
172
  if self.class.log_transaction_generator
168
173
  return self.class.log_transaction_generator.call
169
174
  end
@@ -0,0 +1,22 @@
1
+ module Loggun
2
+ module Modifiers
3
+ class ActiveRecord
4
+ class LoggunLogSubscriber < ::ActiveRecord::LogSubscriber
5
+ def sql(event)
6
+ payload = event.payload
7
+ return if IGNORE_PAYLOAD_NAMES.include?(payload[:name]) || payload[:cached]
8
+
9
+ available_keys = ::Loggun::Config.instance.modifiers.active_record.payload_keys&.map { |k| k.downcase.to_sym }
10
+ data = { sql: payload[:sql], name: payload[:name], duration: event.duration.round(4) }
11
+ source = respond_to?(:extract_query_source_location) ? extract_query_source_location(caller) : nil
12
+ data.merge!(source: source.gsub(/(?<=\.rb)(.*)$/, '')) if source
13
+ if available_keys&.any?
14
+ data.each { |k, _| data.delete(k) unless available_keys.include?(k) }
15
+ end
16
+
17
+ Loggun.info 'storage.sql.query', data
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ module Loggun
2
+ module Modifiers
3
+ class ActiveRecord < Loggun::Modifiers::Base
4
+ def apply
5
+ return unless defined?(::ActiveRecord) && defined?(::ActiveRecord::LogSubscriber)
6
+
7
+ subscriber_class_name = config.modifiers.active_record.log_subscriber_class_name
8
+ if subscriber_class_name == ::Loggun::Config::DEFAULTS[:active_record][:log_subscriber_class_name]
9
+ require 'loggun/modifiers/active_record/loggun_log_subscriber'
10
+ end
11
+ klass = Object.const_get(subscriber_class_name)
12
+
13
+ return klass.attach_to :active_record if klass.respond_to?(:attach_to)
14
+
15
+ Loggun.warn(
16
+ "Loggun: passed active_record.log_subscriber_class_name `#{subscriber_class_name}`" \
17
+ "must respond to #attached_to method"
18
+ )
19
+ end
20
+ end
21
+ end
22
+ end
@@ -14,6 +14,10 @@ module Loggun
14
14
  def apply
15
15
  raise NotImplementedError, 'You must implement #apply in your modifier.'
16
16
  end
17
+
18
+ def config
19
+ Loggun::Config.instance
20
+ end
17
21
  end
18
22
  end
19
23
  end
@@ -0,0 +1,39 @@
1
+ module Loggun
2
+ module Modifiers
3
+ class Sidekiq
4
+ class LoggunFormatter < ::Sidekiq::Logging::Pretty
5
+ def call(severity, time, _program_name, message)
6
+ message, loggun_type = prepared_message(message)
7
+ Loggun::Formatter.new.call(severity, time.utc, nil, message, loggun_type: loggun_type)
8
+ end
9
+
10
+ def prepared_message(message)
11
+ if %w[start].include?(message) || message[/^(done|fail):\s(.*)\ssec$/]
12
+ message, elapsed = split_msg_and_time(message)
13
+ loggun_type = "sidekiq.job.#{message}"
14
+ message = { tid: "#{Thread.current.object_id.to_s(36)}", context: context.strip }
15
+ message[:elapsed] = elapsed if elapsed
16
+ else
17
+ loggun_type = 'app.sidekiq.control'
18
+ message = { tid: Thread.current.object_id.to_s(36), message: message }
19
+ message.merge!(context: context) if context
20
+ end
21
+
22
+ [message, loggun_type]
23
+ end
24
+
25
+ def split_msg_and_time(message)
26
+ unless message[/^done:\s(.*)\ssec$/] || message[/^fail:\s(.*)\ssec$/]
27
+ return [message, nil]
28
+ end
29
+
30
+ msg_type = message[/^done:\s(.*)\ssec$/] ? 'done' : 'fail'
31
+
32
+ msg = message[/#{msg_type}:\s(.*)\ssec/] ? msg_type : message
33
+ elapsed = message.gsub(/#{msg_type}:\s/, '').gsub('sec', '').strip
34
+ [msg, elapsed]
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,25 @@
1
+ module Loggun
2
+ module Modifiers
3
+ class Sidekiq
4
+ class LoggunFormatter < ::Sidekiq::Logger::Formatters::Base
5
+ def call(severity, time, _program_name, message)
6
+ message, loggun_type = prepared_message(message)
7
+ Loggun::Formatter.new.call(severity, time.utc, nil, message, loggun_type: loggun_type)
8
+ end
9
+
10
+ def prepared_message(message)
11
+ if %w[start done fail].include?(message)
12
+ loggun_type = "sidekiq.job.#{message}"
13
+ message = "#{::Sidekiq.dump_json(ctx)}"
14
+ else
15
+ loggun_type = 'app.sidekiq.control'
16
+ message = { tid: tid, message: message }
17
+ message.merge!(context: format_context) if format_context
18
+ end
19
+
20
+ [message, loggun_type]
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -3,11 +3,21 @@ require 'sidekiq' if defined?(::Sidekiq)
3
3
  module Loggun
4
4
  module Modifiers
5
5
  class Sidekiq < Loggun::Modifiers::Base
6
+ MIN_SIDEKIQ_V = '4.0.0'.freeze
7
+
6
8
  def apply
7
- return unless defined?(::Sidekiq)
9
+ return unless defined?(::Sidekiq) && ::Sidekiq::VERSION >= MIN_SIDEKIQ_V
8
10
 
9
11
  ::Sidekiq.configure_server do |config|
10
- Loggun::Config.setup_formatter(config)
12
+ Loggun::Config.setup_formatter(config, LoggunFormatter.new)
13
+ end
14
+ end
15
+
16
+ if defined?(::Sidekiq)
17
+ if ::Sidekiq::VERSION >= '6.0.0'
18
+ require 'loggun/modifiers/sidekiq/sidekiq6'
19
+ else
20
+ require 'loggun/modifiers/sidekiq/sidekiq4'
11
21
  end
12
22
  end
13
23
  end
@@ -1,3 +1,3 @@
1
1
  module Loggun
2
- VERSION = '0.1.1'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loggun
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aleksandr Noskov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-04-06 00:00:00.000000000 Z
12
+ date: 2020-04-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -146,6 +146,8 @@ files:
146
146
  - lib/loggun/helpers.rb
147
147
  - lib/loggun/http_helpers.rb
148
148
  - lib/loggun/modifiers.rb
149
+ - lib/loggun/modifiers/active_record.rb
150
+ - lib/loggun/modifiers/active_record/loggun_log_subscriber.rb
149
151
  - lib/loggun/modifiers/base.rb
150
152
  - lib/loggun/modifiers/clockwork.rb
151
153
  - lib/loggun/modifiers/clockwork/manager.rb
@@ -156,6 +158,8 @@ files:
156
158
  - lib/loggun/modifiers/rails.rb
157
159
  - lib/loggun/modifiers/rails/railtie.rb
158
160
  - lib/loggun/modifiers/sidekiq.rb
161
+ - lib/loggun/modifiers/sidekiq/sidekiq4.rb
162
+ - lib/loggun/modifiers/sidekiq/sidekiq6.rb
159
163
  - lib/loggun/ordered_options.rb
160
164
  - lib/loggun/version.rb
161
165
  - loggun.gemspec