loggun 0.2.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Sponsored by FunBox](https://funbox.ru/badges/sponsored_by_funbox_compact.svg)](https://funbox.ru)
|
4
|
-
|
5
3
|
[![Gem Version](https://badge.fury.io/rb/loggun.svg)](https://badge.fury.io/rb/loggun)
|
6
4
|
[![Build Status](https://travis-ci.org/funbox/loggun.svg?branch=master)](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
|
+
[![Sponsored by FunBox](https://funbox.ru/badges/sponsored_by_funbox_centered.svg)](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
|