loggun 0.2.0 → 0.5.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/.travis.yml +0 -2
- data/CHANGELOG.md +41 -0
- data/README.md +177 -71
- data/lib/loggun.rb +0 -1
- data/lib/loggun/config.rb +30 -2
- data/lib/loggun/formatter.rb +39 -11
- data/lib/loggun/helpers.rb +18 -11
- data/lib/loggun/version.rb +1 -1
- metadata +6 -7
- data/lib/loggun/http_helpers.rb +0 -48
- data/lib/loggun/modifiers/incoming_http.rb +0 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2596dacc5a1bea907afccdabec538190ba574a623c19221189798a1a9f320c74
|
|
4
|
+
data.tar.gz: 2ac4b17d0113f10c3742bf929165c5a6bf95c7273a9e8a2027fe48c170dfef3c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a279ad6a07b077bf7af95aaeba39cae3085808e3e9ab77798a950d192d8e8c9f406b7f49c97f46d80bd7b8b12c5fe77bc38c0fff47c2ee0b055363862d8a45eb
|
|
7
|
+
data.tar.gz: 410fc2d3b572a729f5e7c0ecde19426384b401dd8f2d87b89b20731c4dbcba20b89231b463e3e49c76220bdfafd7d058e75dfa3af88faec1b6645001485bb330
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.5.0 - 2020-09-22
|
|
4
|
+
* features
|
|
5
|
+
* `config.log_format` - for control full log rows format
|
|
6
|
+
* `config.exclude_keys`, `config.include_keys` - for include or exclude keys from `:json` log_format
|
|
7
|
+
|
|
8
|
+
## 0.4.1 - 2020-07-28
|
|
9
|
+
* fixes
|
|
10
|
+
* fill type with class name for empty `log_entity_name`
|
|
11
|
+
|
|
12
|
+
## 0.4.0 - 2020-06-02
|
|
13
|
+
* fixes
|
|
14
|
+
* fix key_value join character to space
|
|
15
|
+
* fix dummy dependency alerts
|
|
16
|
+
* features
|
|
17
|
+
* add new const MESSAGE_FORMATS and test for checking the value of message_format
|
|
18
|
+
* add check message_format
|
|
19
|
+
* boolean flag replace with a whitelist and create method for generating a message
|
|
20
|
+
* added ability to log messages format k=v
|
|
21
|
+
|
|
22
|
+
## 0.3.1 - 2020-04-21
|
|
23
|
+
* fixes
|
|
24
|
+
* fix error "modify frozen String" for class name in helpers
|
|
25
|
+
|
|
26
|
+
## 0.3.0 - 2020-04-17
|
|
27
|
+
* fixes
|
|
28
|
+
* make public #generate_log_transaction_id in helper
|
|
29
|
+
* removed incoming http modifier
|
|
30
|
+
|
|
31
|
+
## 0.2.0 - 2020-04-13
|
|
32
|
+
* fixes
|
|
33
|
+
* fix Readme with active_record modifier
|
|
34
|
+
* fix except option for helper #log_options
|
|
35
|
+
* refactor helpers #log_type
|
|
36
|
+
* fix helper define log_methods caller
|
|
37
|
+
* improve stability of helpers
|
|
38
|
+
* features
|
|
39
|
+
* remove legacy agent from default log pattern
|
|
40
|
+
* new active record modifier
|
|
41
|
+
* improve sidekiq modifier for difference versions
|
data/README.md
CHANGED
|
@@ -1,34 +1,52 @@
|
|
|
1
1
|
# Loggun
|
|
2
2
|
|
|
3
|
-
[](https://funbox.ru)
|
|
4
|
-
|
|
5
3
|
[](https://badge.fury.io/rb/loggun)
|
|
6
4
|
[](https://travis-ci.org/funbox/loggun)
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
Приводит логи приложения к единому формату.
|
|
7
|
+
|
|
8
|
+
## Содержание
|
|
9
|
+
|
|
10
|
+
- [Установка](#установка)
|
|
11
|
+
- [Использование](#использование)
|
|
12
|
+
- [Конфигурация](#конфигурация)
|
|
13
|
+
- [Настройки](#настройки)
|
|
14
|
+
- [Модификаторы](#модификаторы)
|
|
15
|
+
- [Rails модификатор](#rails-модификатор)
|
|
16
|
+
- [Active Record модификатор](#active-record-модификатор)
|
|
17
|
+
- [Sidekiq модификатор](#sidekiq-модификатор)
|
|
18
|
+
- [Clockwork модификатор](#clockwork-модификатор)
|
|
19
|
+
- [Модификатор исходящих HTTP-запросов](#модификатор-исходящих-http-запросов)
|
|
20
|
+
- [Модификатор входящих запросов в Rails](#модификатор-входящих-запросов-в-rails)
|
|
21
|
+
- [Пользовательские модификаторы](#пользовательские-модификаторы)
|
|
22
|
+
- [Хелперы](#хелперы)
|
|
10
23
|
|
|
11
24
|
## Установка
|
|
12
25
|
|
|
13
|
-
Чтобы установить гем, добавьте в
|
|
26
|
+
Чтобы установить гем, добавьте его в Gemfile:
|
|
14
27
|
|
|
15
28
|
```ruby
|
|
16
29
|
gem 'loggun'
|
|
17
30
|
```
|
|
18
31
|
|
|
19
|
-
И выполните
|
|
32
|
+
И выполните команду:
|
|
20
33
|
|
|
21
|
-
|
|
34
|
+
```bash
|
|
35
|
+
$ bundle
|
|
36
|
+
```
|
|
22
37
|
|
|
23
38
|
## Использование
|
|
24
|
-
|
|
25
|
-
|
|
39
|
+
|
|
40
|
+
Loggun можно использовать как обертку для вашего `logger`. Для этого необходимо передать
|
|
41
|
+
ему инстанс логгера и настроить его `formatter`:
|
|
42
|
+
|
|
26
43
|
```ruby
|
|
27
44
|
Loggun.logger = Rails.logger
|
|
28
45
|
Loggun.logger.formatter = Loggun::Formatter.new
|
|
29
46
|
```
|
|
30
47
|
|
|
31
|
-
Теперь
|
|
48
|
+
Теперь можно использовать Loggun для логирования в стандартизированном формате:
|
|
49
|
+
|
|
32
50
|
```ruby
|
|
33
51
|
Loggun.info('http_request.api.request', user_id: current_user.id)
|
|
34
52
|
#=> 2020-04-11T22:35:04.225+03:00 - 170715 INFO http_request.api.request - {"user_id": 5465}
|
|
@@ -37,18 +55,16 @@ Loggun.info('http_request.api.response', user_id: current_user.id, success: true
|
|
|
37
55
|
#=> 2020-04-11T22:35:04.225+03:00 - 170715 INFO http_request.api.response - {"user_id": 5465, "success": true}
|
|
38
56
|
```
|
|
39
57
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
### Конфигурация
|
|
43
|
-
Для успешной конфигурации гема необходимо подгружать файл при инициализации вашего приложения.
|
|
58
|
+
## Конфигурация
|
|
44
59
|
|
|
45
|
-
|
|
60
|
+
Конфигурацию гема необходимо производить при инициализации приложения. Например, так:
|
|
46
61
|
|
|
47
62
|
```ruby
|
|
48
63
|
Loggun::Config.configure do |config|
|
|
49
64
|
config.precision = :milliseconds
|
|
50
65
|
config.pattern = '%{time} - %{pid} %{severity} %{type} %{tags_text} %{message}'
|
|
51
66
|
config.parent_transaction_to_message = false
|
|
67
|
+
config.message_format = :json
|
|
52
68
|
|
|
53
69
|
config.modifiers.rails = true
|
|
54
70
|
config.modifiers.sidekiq = false
|
|
@@ -57,35 +73,102 @@ Loggun::Config.configure do |config|
|
|
|
57
73
|
config.modifiers.outgoing_http = false
|
|
58
74
|
end
|
|
59
75
|
```
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
- `
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
76
|
+
|
|
77
|
+
### Настройки
|
|
78
|
+
|
|
79
|
+
Все настройки опциональны.
|
|
80
|
+
|
|
81
|
+
- `precision` — точность отметок времени.
|
|
82
|
+
|
|
83
|
+
Может принимать одно из следующих значений:
|
|
84
|
+
`sec`, `seconds`, `ms`, `millis`, `milliseconds`, `us`, `micros`, `microseconds`, `ns`, `nanos`, `nanoseconds`.
|
|
85
|
+
|
|
86
|
+
По умолчанию `milliseconds`.
|
|
87
|
+
|
|
88
|
+
- `pattern` — текстовый шаблон для формата вывода данных в лог.
|
|
89
|
+
|
|
90
|
+
Доступные ключи внутри шаблона: `time`, `pid`, `severity`, `type`, `tags_text`, `message`, `parent_transaction`.
|
|
91
|
+
|
|
92
|
+
- `parent_transaction_to_message` — если `true`, то значение `parent_transaction` будет добавлено в тело логируемого сообщения.
|
|
93
|
+
|
|
94
|
+
Ключ `parent_transaction` в шаблоне `pattern` можно использовать вне зависимости от значения этой настройки.
|
|
95
|
+
|
|
96
|
+
- `force_utc` — если `true`, то значение `time` будет переведено в UTC.
|
|
97
|
+
|
|
98
|
+
По умолчанию `false`.
|
|
99
|
+
|
|
100
|
+
- `message_format` — формат переменной `message` в шаблоне `pattern`.
|
|
101
|
+
|
|
102
|
+
Доступные значения:
|
|
103
|
+
|
|
104
|
+
- `:json` — `message` логируется как JSON-строка;
|
|
105
|
+
- `:key_value` — `message` логируется в формате `key1=value1 key2=value2`.
|
|
106
|
+
|
|
107
|
+
- `log_format` — формат лога.
|
|
108
|
+
|
|
109
|
+
Доступные значения:
|
|
110
|
+
|
|
111
|
+
- `:json` — лог формируется как JSON-строка игнорируя шаблон `pattern`;
|
|
112
|
+
- `:plain` — лог формируется по шаблону `pattern`.
|
|
113
|
+
|
|
114
|
+
По умолчанию `:plain`.
|
|
115
|
+
|
|
116
|
+
- `exclude_keys` — список ключей, которые будут исключены из лога.
|
|
117
|
+
|
|
118
|
+
Используется, если `log_format` имеет значение `:json` и список `only_keys` пуст.
|
|
119
|
+
|
|
120
|
+
- `only_keys` — список ключей, которые будут включены в JSON-строку.
|
|
121
|
+
|
|
122
|
+
Используется, если `log_format` имеет значение `:json`.
|
|
123
|
+
|
|
124
|
+
- `modifiers` — модификаторы для переопределения формата логирования указанного компонента. См. «[Модификаторы](#модификаторы)».
|
|
125
|
+
|
|
126
|
+
### Модификаторы
|
|
127
|
+
|
|
70
128
|
Каждый модифкатор может быть активирован двумя равнозначными способами:
|
|
129
|
+
|
|
71
130
|
```ruby
|
|
72
131
|
config.modifiers.rails = true
|
|
73
132
|
```
|
|
133
|
+
|
|
74
134
|
или
|
|
135
|
+
|
|
75
136
|
```ruby
|
|
76
137
|
config.modifiers.rails.enable = true
|
|
77
138
|
```
|
|
78
139
|
|
|
79
|
-
|
|
80
|
-
|
|
140
|
+
(В качестве примера активируется Rails модификатор, но может быть любой другой.)
|
|
141
|
+
|
|
142
|
+
#### Rails модификатор
|
|
143
|
+
|
|
144
|
+
`config.modifier.rails`
|
|
145
|
+
|
|
146
|
+
Модифицирует форматирование логгера Rails.
|
|
147
|
+
|
|
148
|
+
#### Active Record модификатор
|
|
149
|
+
|
|
150
|
+
`config.modifier.active_record`
|
|
151
|
+
|
|
152
|
+
Добавляет (именно добавляет, а не модифицирует) нового подписчика на SQL-события.
|
|
153
|
+
|
|
154
|
+
SQL начинает дополнительно логироваться в Loggun формате, `severity` — `info`. Например:
|
|
81
155
|
|
|
82
|
-
##### Active Record модификатор
|
|
83
|
-
`config.modifier.active_record` - добавляет (именно добавляет, а не модифицирует) нового подписчика на SQL события.
|
|
84
|
-
SQL начинает дополнительно логгироваться в Loggun формате, severity - info. Например:
|
|
85
156
|
```text
|
|
86
157
|
2020-04-12T20:08:52.913+03:00 - 487257 INFO storage.sql.query - {"sql":"SELECT 1","name":null,"duration":0.837}
|
|
87
158
|
```
|
|
88
|
-
|
|
159
|
+
|
|
160
|
+
Дополнительные настройки:
|
|
161
|
+
|
|
162
|
+
- `log_subscriber_class_name` — имя класса, реализующего логирование SQL-события.
|
|
163
|
+
|
|
164
|
+
Необходим метод `#sql`. По умолчанию: `::Loggun::Modifiers::ActiveRecord::LoggunLogSubscriber`.
|
|
165
|
+
|
|
166
|
+
- `payload_keys` — необходимые ключи в полезной нарзуке. Используется в классе по умолчанию.
|
|
167
|
+
|
|
168
|
+
Доступные ключи: `%i[sql name duration source]`.
|
|
169
|
+
|
|
170
|
+
Пример:
|
|
171
|
+
|
|
89
172
|
```ruby
|
|
90
173
|
Loggun::Config.configure do |config|
|
|
91
174
|
#...
|
|
@@ -95,26 +178,46 @@ Loggun::Config.configure do |config|
|
|
|
95
178
|
#...
|
|
96
179
|
end
|
|
97
180
|
```
|
|
98
|
-
- `log_subscriber_class_name` - имя класса, реализующего логирование sql события.
|
|
99
|
-
Необходим метод `#sql`. По-умолчанию `::Loggun::Modifiers::ActiveRecord::LoggunLogSubscriber`
|
|
100
181
|
|
|
101
|
-
|
|
102
|
-
|
|
182
|
+
#### Sidekiq модификатор
|
|
183
|
+
|
|
184
|
+
`config.modifiers.sidekiq`
|
|
185
|
+
|
|
186
|
+
Модифицирует форматирование логгера Sidekiq.
|
|
187
|
+
|
|
188
|
+
#### Clockwork модификатор
|
|
189
|
+
|
|
190
|
+
`config.modifiers.clockwork`
|
|
191
|
+
|
|
192
|
+
Модифицирует форматирование логгера Clockwork.
|
|
193
|
+
|
|
194
|
+
#### Модификатор исходящих HTTP-запросов
|
|
195
|
+
|
|
196
|
+
`config.modifiers.outgoing_http`
|
|
197
|
+
|
|
198
|
+
Добавляет логирование исходящих HTTP-запросов.
|
|
199
|
+
На данный момент поддерживаются только запросы, выполненные с помощью гема `HTTP`.
|
|
200
|
+
|
|
201
|
+
#### Модификатор входящих запросов в Rails
|
|
202
|
+
|
|
203
|
+
`config.modifiers.incoming_http`
|
|
204
|
+
|
|
205
|
+
Добавляет логирование входящих HTTP-запросов для контроллеров Rails.
|
|
103
206
|
|
|
104
|
-
|
|
105
|
-
`config.modifiers.sidekiq` - модифицирует форматирование логгера Sidekiq.
|
|
207
|
+
Может иметь дополнительные настройки:
|
|
106
208
|
|
|
107
|
-
|
|
108
|
-
`config.modifiers.clockwork` - модифицирует форматирование логгера Clockwork.
|
|
209
|
+
- `controllers` — массив имён базовых контроллеров, для которых необходимо добавить указанное логирование.
|
|
109
210
|
|
|
110
|
-
|
|
111
|
-
`config.modifiers.outgoing_http` - добавляет логирование исходящих http запросов.
|
|
112
|
-
На данный момент поддерживаются только запросы посредством гема `HTTP`.
|
|
211
|
+
- `success_condition` — лямбда, определяющая, содержит ли успех ответ экшена.
|
|
113
212
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
213
|
+
Например: `-> { JSON.parse(response.body)['result'] == 'ok' }`
|
|
214
|
+
|
|
215
|
+
- `error_info` — лямбда, позволяющая добавить в лог информацию об ошибке, содержащейся в неуспешном ответе экшена.
|
|
216
|
+
|
|
217
|
+
Например: `-> { JSON.parse(response.body)['error_code'] }`
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
Пример (приведены значения по умолчанию):
|
|
118
221
|
|
|
119
222
|
```ruby
|
|
120
223
|
Loggun::Config.configure do |config|
|
|
@@ -126,26 +229,25 @@ Loggun::Config.configure do |config|
|
|
|
126
229
|
#...
|
|
127
230
|
end
|
|
128
231
|
```
|
|
129
|
-
- `controllers` - массив имён базовых контроллеров, для которых необходимо добавить указанное логирование.
|
|
130
232
|
|
|
131
|
-
|
|
233
|
+
**Для Rails 6 и выше данный модификатор может работать некорректно.**
|
|
132
234
|
|
|
133
|
-
|
|
134
|
-
Например `-> { JSON.parse(response.body)['error_code'] }`
|
|
235
|
+
В этом случае можно добавить в требуемый базовый контроллер строку:
|
|
135
236
|
|
|
136
|
-
**Для Rails 6 и выше данный модификатор может работать некорректно.**
|
|
137
|
-
В этом случае можно указать в требуемом базовом контроллере строку:
|
|
138
237
|
```ruby
|
|
139
238
|
include Loggun::HttpHelpers
|
|
140
239
|
```
|
|
240
|
+
|
|
141
241
|
Это делает настройки `enable` и `controllers` модификатора безсполезными,
|
|
142
|
-
однако позволяет гарантированно логировать входящие
|
|
242
|
+
однако позволяет гарантированно логировать входящие HTTP-запросы.
|
|
143
243
|
|
|
144
244
|
Настройки `success_condition` и `error_info` продолжают использоваться и могут быть установлены требуемым образом.
|
|
145
245
|
|
|
146
|
-
|
|
246
|
+
#### Пользовательские модификаторы
|
|
247
|
+
|
|
147
248
|
Помимо указанных модификаторов существует возможность добавить собственный.
|
|
148
|
-
Необходимо уснаследовать его от `Loggun::Modifiers::Base` и указать в методе `apply` все необходимые
|
|
249
|
+
Необходимо уснаследовать его от `Loggun::Modifiers::Base` и указать в методе `apply` все необходимые действия:
|
|
250
|
+
|
|
149
251
|
```ruby
|
|
150
252
|
require 'sinatra/custom_logger'
|
|
151
253
|
|
|
@@ -155,7 +257,9 @@ class NewModifier < Loggun::Modifiers::Base
|
|
|
155
257
|
end
|
|
156
258
|
end
|
|
157
259
|
```
|
|
158
|
-
|
|
260
|
+
|
|
261
|
+
Затем необходимо добавить его при конфигурации гема:
|
|
262
|
+
|
|
159
263
|
|
|
160
264
|
```ruby
|
|
161
265
|
Loggun::Config.configure do |config|
|
|
@@ -166,10 +270,12 @@ end
|
|
|
166
270
|
```
|
|
167
271
|
|
|
168
272
|
### Хелперы
|
|
169
|
-
|
|
273
|
+
|
|
274
|
+
Подключение хэлперов в класс позволяет использовать методы логирования `log_info` и `log_error`,
|
|
170
275
|
а также генерировать идентификатор транзации для каждого метода класса.
|
|
171
276
|
|
|
172
277
|
Например:
|
|
278
|
+
|
|
173
279
|
```ruby
|
|
174
280
|
class SomeClass
|
|
175
281
|
include Loggun::Helpers
|
|
@@ -183,26 +289,26 @@ class SomeClass
|
|
|
183
289
|
end
|
|
184
290
|
end
|
|
185
291
|
```
|
|
186
|
-
|
|
292
|
+
|
|
293
|
+
При вызове `#download_data` будет следующий вывод в лог:
|
|
294
|
+
|
|
187
295
|
```
|
|
188
296
|
2020-03-04T16:58:38.207+05:00 - 28476 INFO http_request.some_class.download_data#ffg5431_1583323118203 - {"message":["Information"]}
|
|
189
297
|
2020-03-04T16:58:38.208+05:00 - 28476 INFO http_response.some_class.download_data#ffg5431_1583323118203 - {"success": true}
|
|
190
298
|
```
|
|
191
299
|
|
|
192
|
-
**Важно**, что с
|
|
300
|
+
**Важно**, что с хэлпером `log_options` необходимо использовать только методы вида `log_<severity>`.
|
|
193
301
|
Методы модуля `Loggun` не будут работать.
|
|
194
302
|
|
|
195
|
-
Список всех опций
|
|
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}
|
|
303
|
+
Список всех опций хэлпера `log_options`:
|
|
205
304
|
|
|
206
|
-
|
|
305
|
+
- `entity_name` — имя сущности метода, `string`;
|
|
306
|
+
- `entity_action` — действие сущности метода, `string`;
|
|
307
|
+
- `as_transaction` — добавлять ли уникальный ID транзакции для метода, `boolean`;
|
|
308
|
+
- `transaction_generator` — собственный генератор ID транзакции, `lambda`;
|
|
309
|
+
- `log_all_methods` — применять ли хэлпер ко всем методам, `boolean`;
|
|
310
|
+
- `only` — список методов, для которых необходимо применить хэлпер (работает только когда `log_all_methods = false`), `Array{Symbol}`;
|
|
311
|
+
- `except` — список методов, которые надо исключить для хэлпера, `Array{Symbol}`;
|
|
312
|
+
- `log_transaction_except` — список методов, логирование которых не нужно обогащать ID транзакции, `Array{Symbol}`.
|
|
207
313
|
|
|
208
|
-
|
|
314
|
+
[](https://funbox.ru)
|
data/lib/loggun.rb
CHANGED
data/lib/loggun/config.rb
CHANGED
|
@@ -8,6 +8,9 @@ module Loggun
|
|
|
8
8
|
DEFAULTS = {
|
|
9
9
|
pattern: '%{time} - %{pid} %{severity} %{type} %{tags_text} %{message}',
|
|
10
10
|
parent_transaction_to_message: true,
|
|
11
|
+
message_format: :json,
|
|
12
|
+
log_format: :plain,
|
|
13
|
+
force_utc: false,
|
|
11
14
|
precision: :milliseconds,
|
|
12
15
|
incoming_http: {
|
|
13
16
|
controllers: %w[ApplicationController],
|
|
@@ -19,15 +22,22 @@ module Loggun
|
|
|
19
22
|
payload_keys: %i[sql name duration source]
|
|
20
23
|
}
|
|
21
24
|
}.freeze
|
|
22
|
-
DEFAULT_MODIFIERS = %i[rails active_record sidekiq clockwork
|
|
25
|
+
DEFAULT_MODIFIERS = %i[rails active_record sidekiq clockwork outgoing_http].freeze
|
|
26
|
+
MESSAGE_FORMATS = %i[json key_value].freeze
|
|
27
|
+
LOG_FORMATS = %i[json plain].freeze
|
|
23
28
|
|
|
24
29
|
attr_accessor(
|
|
25
30
|
:formatter,
|
|
26
31
|
:pattern,
|
|
27
32
|
:parent_transaction_to_message,
|
|
33
|
+
:message_format,
|
|
34
|
+
:log_format,
|
|
35
|
+
:force_utc,
|
|
28
36
|
:precision,
|
|
29
37
|
:modifiers,
|
|
30
|
-
:custom_modifiers
|
|
38
|
+
:custom_modifiers,
|
|
39
|
+
:exclude_keys,
|
|
40
|
+
:only_keys
|
|
31
41
|
)
|
|
32
42
|
|
|
33
43
|
def initialize
|
|
@@ -35,8 +45,13 @@ module Loggun
|
|
|
35
45
|
@precision = DEFAULTS[:precision]
|
|
36
46
|
@pattern = DEFAULTS[:pattern]
|
|
37
47
|
@parent_transaction_to_message = DEFAULTS[:parent_transaction_to_message]
|
|
48
|
+
@message_format = DEFAULTS[:message_format]
|
|
49
|
+
@log_format = DEFAULTS[:log_format]
|
|
50
|
+
@force_utc = DEFAULTS[:force_utc]
|
|
38
51
|
@modifiers = Loggun::OrderedOptions.new
|
|
39
52
|
@custom_modifiers = []
|
|
53
|
+
@exclude_keys = []
|
|
54
|
+
@only_keys = []
|
|
40
55
|
set_default_modifiers
|
|
41
56
|
end
|
|
42
57
|
|
|
@@ -44,6 +59,7 @@ module Loggun
|
|
|
44
59
|
def configure(&block)
|
|
45
60
|
block.call(instance)
|
|
46
61
|
use_modifiers
|
|
62
|
+
check_config
|
|
47
63
|
instance
|
|
48
64
|
end
|
|
49
65
|
|
|
@@ -59,6 +75,16 @@ module Loggun
|
|
|
59
75
|
instance.custom_modifiers.each(&:use)
|
|
60
76
|
end
|
|
61
77
|
|
|
78
|
+
def check_config
|
|
79
|
+
unless MESSAGE_FORMATS.include? instance.message_format
|
|
80
|
+
raise FailureConfiguration, 'Unknown value for message_format'
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
unless LOG_FORMATS.include? instance.log_format
|
|
84
|
+
raise FailureConfiguration, 'Unknown value for log_format'
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
62
88
|
def setup_formatter(app, formatter = nil)
|
|
63
89
|
Loggun.logger = app.logger
|
|
64
90
|
Loggun.logger.formatter = formatter || instance.formatter
|
|
@@ -91,5 +117,7 @@ module Loggun
|
|
|
91
117
|
3 # milliseconds
|
|
92
118
|
end
|
|
93
119
|
end
|
|
120
|
+
|
|
121
|
+
class FailureConfiguration < StandardError; end
|
|
94
122
|
end
|
|
95
123
|
end
|
data/lib/loggun/formatter.rb
CHANGED
|
@@ -7,17 +7,13 @@ module Loggun
|
|
|
7
7
|
|
|
8
8
|
def call(severity, time, _program_name, message, loggun_type: nil)
|
|
9
9
|
data = Hash.new(DEFAULT_VALUE)
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
time = time.utc if config.force_utc
|
|
11
|
+
message = prepare_message(message)
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
message = JSON.generate(message)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
data[:message] = message.to_s.tr("\r\n", ' ').strip
|
|
13
|
+
data[:timestamp] = time.iso8601(config.timestamp_precision)
|
|
14
|
+
data[:time] = data[:timestamp] if config.log_format == :plain
|
|
15
|
+
data[:pid] = Process.pid
|
|
16
|
+
data[:message] = message
|
|
21
17
|
data[:severity] = severity&.to_s || 'INFO'
|
|
22
18
|
data[:tags_text] = tags_text
|
|
23
19
|
data[:type] = loggun_type || Loggun.type || DEFAULT_VALUE.dup
|
|
@@ -29,7 +25,13 @@ module Loggun
|
|
|
29
25
|
data[:type] = "#{data[:type]}##{data[:transaction_id]}"
|
|
30
26
|
end
|
|
31
27
|
|
|
32
|
-
|
|
28
|
+
if config.log_format == :json
|
|
29
|
+
data.except!(*config.exclude_keys) if config.only_keys.empty?
|
|
30
|
+
data.slice!(*config.only_keys) if config.only_keys.any?
|
|
31
|
+
JSON.generate(data) + "\n"
|
|
32
|
+
else
|
|
33
|
+
format(config.pattern + "\n", data)
|
|
34
|
+
end
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
def tagged(*tags)
|
|
@@ -69,6 +71,21 @@ module Loggun
|
|
|
69
71
|
|
|
70
72
|
private
|
|
71
73
|
|
|
74
|
+
def prepare_message(message)
|
|
75
|
+
if message.is_a?(Hash)
|
|
76
|
+
if config.parent_transaction_to_message && parent_transaction
|
|
77
|
+
message[:parent_transaction] = parent_transaction
|
|
78
|
+
end
|
|
79
|
+
message = format_message(message) if config.log_format == :plain
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
if config.log_format == :plain
|
|
83
|
+
message.to_s.tr("\r\n", ' ').strip
|
|
84
|
+
else
|
|
85
|
+
message
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
72
89
|
def parent_transaction
|
|
73
90
|
return unless Loggun.parent_type && Loggun.parent_transaction_id
|
|
74
91
|
|
|
@@ -78,5 +95,16 @@ module Loggun
|
|
|
78
95
|
def config
|
|
79
96
|
Loggun::Config.instance
|
|
80
97
|
end
|
|
98
|
+
|
|
99
|
+
def format_message(message)
|
|
100
|
+
if config.message_format == :json
|
|
101
|
+
JSON.generate(message)
|
|
102
|
+
elsif config.message_format == :key_value
|
|
103
|
+
message.map { |key, value| "#{key}=#{value}" }.join(' ')
|
|
104
|
+
else
|
|
105
|
+
warn('Unknown value for message_format')
|
|
106
|
+
JSON.generate(message)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
81
109
|
end
|
|
82
110
|
end
|
data/lib/loggun/helpers.rb
CHANGED
|
@@ -86,7 +86,10 @@ module Loggun
|
|
|
86
86
|
attrs[:hidden] = { error: { backtrace: error.backtrace } }
|
|
87
87
|
end
|
|
88
88
|
end
|
|
89
|
-
|
|
89
|
+
unless args.empty?
|
|
90
|
+
attrs[:message] = args.first if args.size == 1
|
|
91
|
+
attrs[:message] ||= args
|
|
92
|
+
end
|
|
90
93
|
|
|
91
94
|
with_log_type(type) do
|
|
92
95
|
logger.send(method_name, **attrs, &block)
|
|
@@ -138,8 +141,12 @@ module Loggun
|
|
|
138
141
|
type ||= DEFAULT_TYPE.dup
|
|
139
142
|
type_as_arr = type.split('.')
|
|
140
143
|
|
|
141
|
-
|
|
142
|
-
|
|
144
|
+
if type_as_arr.size == 1
|
|
145
|
+
log_entity_name = klass.log_entity_name if klass.respond_to?(:log_entity_name)
|
|
146
|
+
|
|
147
|
+
log_entity_name ||= underscore(klass.name.dup)
|
|
148
|
+
type_as_arr << log_entity_name
|
|
149
|
+
end
|
|
143
150
|
|
|
144
151
|
return type unless klass.respond_to?(:log_entity_action)
|
|
145
152
|
|
|
@@ -150,6 +157,14 @@ module Loggun
|
|
|
150
157
|
type_as_arr.join('.')
|
|
151
158
|
end
|
|
152
159
|
|
|
160
|
+
def generate_log_transaction_id
|
|
161
|
+
if self.class.log_transaction_generator
|
|
162
|
+
return self.class.log_transaction_generator.call(self)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
"#{SecureRandom.uuid[0..7]}_#{DateTime.now.strftime('%Q')}"
|
|
166
|
+
end
|
|
167
|
+
|
|
153
168
|
private
|
|
154
169
|
|
|
155
170
|
def normalize(type)
|
|
@@ -168,14 +183,6 @@ module Loggun
|
|
|
168
183
|
word
|
|
169
184
|
end
|
|
170
185
|
|
|
171
|
-
def generate_log_transaction_id
|
|
172
|
-
if self.class.log_transaction_generator
|
|
173
|
-
return self.class.log_transaction_generator.call
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
"#{SecureRandom.uuid[0..7]}_#{DateTime.now.strftime('%Q')}"
|
|
177
|
-
end
|
|
178
|
-
|
|
179
186
|
def logger
|
|
180
187
|
Loggun.logger
|
|
181
188
|
end
|
data/lib/loggun/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: loggun
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Aleksandr Noskov
|
|
8
8
|
- Sergey Nesterov
|
|
9
|
-
autorequire:
|
|
9
|
+
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2020-
|
|
12
|
+
date: 2020-09-22 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: bundler
|
|
@@ -134,6 +134,7 @@ files:
|
|
|
134
134
|
- ".gitignore"
|
|
135
135
|
- ".rspec"
|
|
136
136
|
- ".travis.yml"
|
|
137
|
+
- CHANGELOG.md
|
|
137
138
|
- Gemfile
|
|
138
139
|
- LICENSE.txt
|
|
139
140
|
- README.md
|
|
@@ -144,7 +145,6 @@ files:
|
|
|
144
145
|
- lib/loggun/config.rb
|
|
145
146
|
- lib/loggun/formatter.rb
|
|
146
147
|
- lib/loggun/helpers.rb
|
|
147
|
-
- lib/loggun/http_helpers.rb
|
|
148
148
|
- lib/loggun/modifiers.rb
|
|
149
149
|
- lib/loggun/modifiers/active_record.rb
|
|
150
150
|
- lib/loggun/modifiers/active_record/loggun_log_subscriber.rb
|
|
@@ -152,7 +152,6 @@ files:
|
|
|
152
152
|
- lib/loggun/modifiers/clockwork.rb
|
|
153
153
|
- lib/loggun/modifiers/clockwork/manager.rb
|
|
154
154
|
- lib/loggun/modifiers/clockwork/methods.rb
|
|
155
|
-
- lib/loggun/modifiers/incoming_http.rb
|
|
156
155
|
- lib/loggun/modifiers/outgoing_http.rb
|
|
157
156
|
- lib/loggun/modifiers/outgoing_http/block_logger.rb
|
|
158
157
|
- lib/loggun/modifiers/rails.rb
|
|
@@ -169,7 +168,7 @@ licenses:
|
|
|
169
168
|
metadata:
|
|
170
169
|
homepage_uri: https://github.com/funbox/loggun
|
|
171
170
|
source_code_uri: https://github.com/funbox/loggun
|
|
172
|
-
post_install_message:
|
|
171
|
+
post_install_message:
|
|
173
172
|
rdoc_options: []
|
|
174
173
|
require_paths:
|
|
175
174
|
- lib
|
|
@@ -185,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
185
184
|
version: '0'
|
|
186
185
|
requirements: []
|
|
187
186
|
rubygems_version: 3.0.6
|
|
188
|
-
signing_key:
|
|
187
|
+
signing_key:
|
|
189
188
|
specification_version: 4
|
|
190
189
|
summary: Loggun
|
|
191
190
|
test_files: []
|
data/lib/loggun/http_helpers.rb
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
module Loggun
|
|
2
|
-
module HttpHelpers
|
|
3
|
-
def self.included(klass)
|
|
4
|
-
klass.class_eval do
|
|
5
|
-
around_action :log_http_actions
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
private
|
|
10
|
-
|
|
11
|
-
def log_http_actions
|
|
12
|
-
log_action :start
|
|
13
|
-
yield
|
|
14
|
-
log_action :response
|
|
15
|
-
rescue StandardError => e
|
|
16
|
-
log_action :response, fail: e
|
|
17
|
-
raise e
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def log_action(action = :start, fail: nil)
|
|
21
|
-
api = request.path[/\w+/]
|
|
22
|
-
api_version = request.path[/v./]
|
|
23
|
-
type = "http_request.#{api}.#{action}"
|
|
24
|
-
data = { path: clean_pathname }
|
|
25
|
-
data[:api_version] = api_version if api_version
|
|
26
|
-
|
|
27
|
-
return Loggun.info type, data if action == :start
|
|
28
|
-
|
|
29
|
-
success = fail.nil? && instance_exec(&modifier_config.success_condition)
|
|
30
|
-
data[:success] = success
|
|
31
|
-
unless success
|
|
32
|
-
error = instance_exec(&modifier_config.error_info)
|
|
33
|
-
data[:error] = error if error
|
|
34
|
-
end
|
|
35
|
-
Loggun.info type, data
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def clean_pathname
|
|
39
|
-
filtered_params = params.to_unsafe_h
|
|
40
|
-
filtered_params.delete('action')
|
|
41
|
-
request.path.gsub(/(#{filtered_params.values.join('|')})/, '').gsub(/\/api\/v./, '')
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def modifier_config
|
|
45
|
-
Loggun::Config.instance.modifiers.incoming_http
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
module Loggun
|
|
2
|
-
module Modifiers
|
|
3
|
-
class IncomingHttp < Loggun::Modifiers::Base
|
|
4
|
-
def apply
|
|
5
|
-
return unless defined?(ActionPack)
|
|
6
|
-
|
|
7
|
-
controllers = Loggun::Config.instance.modifiers.incoming_http.controllers
|
|
8
|
-
controllers.each do |controller|
|
|
9
|
-
controller.constantize.class_eval do
|
|
10
|
-
include Loggun::HttpHelpers
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|