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 +4 -4
- data/README.md +83 -30
- data/lib/loggun/config.rb +8 -4
- data/lib/loggun/formatter.rb +2 -2
- data/lib/loggun/helpers.rb +46 -41
- data/lib/loggun/modifiers/active_record/loggun_log_subscriber.rb +22 -0
- data/lib/loggun/modifiers/active_record.rb +22 -0
- data/lib/loggun/modifiers/base.rb +4 -0
- data/lib/loggun/modifiers/sidekiq/sidekiq4.rb +39 -0
- data/lib/loggun/modifiers/sidekiq/sidekiq6.rb +25 -0
- data/lib/loggun/modifiers/sidekiq.rb +12 -2
- data/lib/loggun/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 756771ea707f7cbaafd88da80dc72afd4311702718de31a087711b258f68d47a
|
4
|
+
data.tar.gz: b2a00e34692488e289888c9f3d7aa433fc30f66828a160762cf2fe80aa5ea46b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
79
|
+
##### Rails модификатор
|
80
|
+
`config.modifier.rails` - модифицирует форматирование логгера Rails.
|
65
81
|
|
66
|
-
|
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
|
-
`
|
101
|
+
- `payload_keys` - необходимые ключи в полезной нарзуке. Используется в дефолтном классе. Доступные
|
102
|
+
ключи: ```%i[sql name duration source]```.
|
69
103
|
|
70
|
-
|
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
|
-
|
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
|
-
`
|
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
|
-
|
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
|
138
|
-
log_info '
|
139
|
-
|
140
|
-
|
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
|
150
|
-
2020-03-04T16:58:38.208+05:00 - 28476 INFO
|
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}
|
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
|
|
data/lib/loggun/formatter.rb
CHANGED
@@ -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
|
|
data/lib/loggun/helpers.rb
CHANGED
@@ -3,53 +3,65 @@ require 'securerandom'
|
|
3
3
|
module Loggun
|
4
4
|
module Helpers
|
5
5
|
SKIPPED_METHODS = %i[
|
6
|
-
initialize loggun logger
|
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
|
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
|
-
:
|
22
|
-
:
|
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
|
-
@
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
-
@
|
40
|
-
return if SKIPPED_METHODS.include?(method_name) ||
|
41
|
-
modified_methods.include?(method_name)
|
49
|
+
@log_modified_methods ||= []
|
42
50
|
|
43
|
-
|
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.
|
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
|
-
|
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 |
|
61
|
-
define_method("log_#{
|
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(
|
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
|
-
|
70
|
-
|
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[:
|
89
|
+
attrs[:message] = args unless args.empty?
|
82
90
|
|
83
|
-
|
84
|
-
logger.send(
|
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
|
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
|
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
|
-
|
132
|
-
log_entity_name = klass.log_entity_name
|
133
|
-
log_entity_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
|
-
|
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
|
-
|
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
|
@@ -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
|
data/lib/loggun/version.rb
CHANGED
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.
|
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-
|
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
|