loggun 0.3.1 → 0.6.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 +49 -0
- data/README.md +191 -71
- data/lib/loggun/config.rb +29 -1
- data/lib/loggun/formatter.rb +55 -16
- data/lib/loggun/helpers.rb +7 -2
- data/lib/loggun/modifiers/sidekiq.rb +13 -0
- data/lib/loggun/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8bdbf0283432b32fe9fe682ca29e432480e1bae6cc4ff31879b50a26120b10c9
|
4
|
+
data.tar.gz: bce5fe0878cba0d1e758289baa9b2227bfc81a1946443c2b7bfc8ee4580a3267
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8f76f5a5d5244f20d6b3cf5ed1f2c41ef87f93f50ac107626bc6f45cc2a3b44629d6b3d45af61bbd79e424f99ce99f1070937bb97c6e35906c8ea6d2609efd8
|
7
|
+
data.tar.gz: 923f02afe9583bbb919671fbeb6fb54e8553efd1a01a6102d2eed865158a21c30c1effdd9e46f836488541b622ac8ae7e5c6ca9bfaa89e43752de40f0827aef3
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 0.6.0 - 2020-09-22
|
4
|
+
* features
|
5
|
+
* Sidekiq client middlware for logging enqueued jobs
|
6
|
+
|
7
|
+
## 0.5.1 - 2020-09-22
|
8
|
+
* fix
|
9
|
+
* `message` string only in `log_format == :json`
|
10
|
+
|
11
|
+
## 0.5.0 - 2020-09-22
|
12
|
+
* features
|
13
|
+
* `config.log_format` - for control full log rows format
|
14
|
+
* `config.exclude_keys`, `config.include_keys` - for include or exclude keys from `:json` log_format
|
15
|
+
|
16
|
+
## 0.4.1 - 2020-07-28
|
17
|
+
* fixes
|
18
|
+
* fill type with class name for empty `log_entity_name`
|
19
|
+
|
20
|
+
## 0.4.0 - 2020-06-02
|
21
|
+
* fixes
|
22
|
+
* fix key_value join character to space
|
23
|
+
* fix dummy dependency alerts
|
24
|
+
* features
|
25
|
+
* add new const MESSAGE_FORMATS and test for checking the value of message_format
|
26
|
+
* add check message_format
|
27
|
+
* boolean flag replace with a whitelist and create method for generating a message
|
28
|
+
* added ability to log messages format k=v
|
29
|
+
|
30
|
+
## 0.3.1 - 2020-04-21
|
31
|
+
* fixes
|
32
|
+
* fix error "modify frozen String" for class name in helpers
|
33
|
+
|
34
|
+
## 0.3.0 - 2020-04-17
|
35
|
+
* fixes
|
36
|
+
* make public #generate_log_transaction_id in helper
|
37
|
+
* removed incoming http modifier
|
38
|
+
|
39
|
+
## 0.2.0 - 2020-04-13
|
40
|
+
* fixes
|
41
|
+
* fix Readme with active_record modifier
|
42
|
+
* fix except option for helper #log_options
|
43
|
+
* refactor helpers #log_type
|
44
|
+
* fix helper define log_methods caller
|
45
|
+
* improve stability of helpers
|
46
|
+
* features
|
47
|
+
* remove legacy agent from default log pattern
|
48
|
+
* new active record modifier
|
49
|
+
* 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
|
-
|
58
|
+
## Конфигурация
|
41
59
|
|
42
|
-
|
43
|
-
Для успешной конфигурации гема необходимо подгружать файл при инициализации вашего приложения.
|
44
|
-
|
45
|
-
`config/initializers/loggun.rb`
|
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,116 @@ 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` и настройку `message_format`;
|
112
|
+
- `:plain` — лог формируется по шаблону `pattern`.
|
113
|
+
|
114
|
+
По умолчанию `:plain`.
|
115
|
+
|
116
|
+
При `log_format == :json` в `message` будет попадать только сообщение, которое было передано строкой. Сообщение,
|
117
|
+
переданное хешем попадет в поле `metadata`. Пример:
|
118
|
+
```ruby
|
119
|
+
Loggun.info("my.best.action", "message string", test: true)
|
120
|
+
# {
|
121
|
+
# "metadata":{"test":true},
|
122
|
+
# "message":"message string",
|
123
|
+
# "type":"my.best.action",
|
124
|
+
# "timestamp":"2020-09-22T14:57:22.233+03:00",
|
125
|
+
# "severity":"INFO",
|
126
|
+
# ...
|
127
|
+
# }
|
128
|
+
```
|
129
|
+
|
130
|
+
- `exclude_keys` — список ключей, которые будут исключены из лога.
|
131
|
+
|
132
|
+
Используется, если `log_format` имеет значение `:json` и список `only_keys` пуст.
|
133
|
+
|
134
|
+
- `only_keys` — список ключей, которые будут включены в JSON-строку.
|
135
|
+
|
136
|
+
Используется, если `log_format` имеет значение `:json`.
|
137
|
+
|
138
|
+
- `modifiers` — модификаторы для переопределения формата логирования указанного компонента. См. «[Модификаторы](#модификаторы)».
|
139
|
+
|
140
|
+
### Модификаторы
|
141
|
+
|
70
142
|
Каждый модифкатор может быть активирован двумя равнозначными способами:
|
143
|
+
|
71
144
|
```ruby
|
72
145
|
config.modifiers.rails = true
|
73
146
|
```
|
147
|
+
|
74
148
|
или
|
149
|
+
|
75
150
|
```ruby
|
76
151
|
config.modifiers.rails.enable = true
|
77
152
|
```
|
78
153
|
|
79
|
-
|
80
|
-
|
154
|
+
(В качестве примера активируется Rails модификатор, но может быть любой другой.)
|
155
|
+
|
156
|
+
#### Rails модификатор
|
157
|
+
|
158
|
+
`config.modifier.rails`
|
159
|
+
|
160
|
+
Модифицирует форматирование логгера Rails.
|
161
|
+
|
162
|
+
#### Active Record модификатор
|
163
|
+
|
164
|
+
`config.modifier.active_record`
|
165
|
+
|
166
|
+
Добавляет (именно добавляет, а не модифицирует) нового подписчика на SQL-события.
|
167
|
+
|
168
|
+
SQL начинает дополнительно логироваться в Loggun формате, `severity` — `info`. Например:
|
81
169
|
|
82
|
-
##### Active Record модификатор
|
83
|
-
`config.modifier.active_record` - добавляет (именно добавляет, а не модифицирует) нового подписчика на SQL события.
|
84
|
-
SQL начинает дополнительно логгироваться в Loggun формате, severity - info. Например:
|
85
170
|
```text
|
86
171
|
2020-04-12T20:08:52.913+03:00 - 487257 INFO storage.sql.query - {"sql":"SELECT 1","name":null,"duration":0.837}
|
87
172
|
```
|
88
|
-
|
173
|
+
|
174
|
+
Дополнительные настройки:
|
175
|
+
|
176
|
+
- `log_subscriber_class_name` — имя класса, реализующего логирование SQL-события.
|
177
|
+
|
178
|
+
Необходим метод `#sql`. По умолчанию: `::Loggun::Modifiers::ActiveRecord::LoggunLogSubscriber`.
|
179
|
+
|
180
|
+
- `payload_keys` — необходимые ключи в полезной нарзуке. Используется в классе по умолчанию.
|
181
|
+
|
182
|
+
Доступные ключи: `%i[sql name duration source]`.
|
183
|
+
|
184
|
+
Пример:
|
185
|
+
|
89
186
|
```ruby
|
90
187
|
Loggun::Config.configure do |config|
|
91
188
|
#...
|
@@ -95,26 +192,46 @@ Loggun::Config.configure do |config|
|
|
95
192
|
#...
|
96
193
|
end
|
97
194
|
```
|
98
|
-
- `log_subscriber_class_name` - имя класса, реализующего логирование sql события.
|
99
|
-
Необходим метод `#sql`. По-умолчанию `::Loggun::Modifiers::ActiveRecord::LoggunLogSubscriber`
|
100
195
|
|
101
|
-
|
102
|
-
ключи: ```%i[sql name duration source]```.
|
196
|
+
#### Sidekiq модификатор
|
103
197
|
|
104
|
-
|
105
|
-
`config.modifiers.sidekiq` - модифицирует форматирование логгера Sidekiq.
|
198
|
+
`config.modifiers.sidekiq`
|
106
199
|
|
107
|
-
|
108
|
-
`config.modifiers.clockwork` - модифицирует форматирование логгера Clockwork.
|
200
|
+
Модифицирует форматирование логгера Sidekiq.
|
109
201
|
|
110
|
-
|
111
|
-
`config.modifiers.outgoing_http` - добавляет логирование исходящих http запросов.
|
112
|
-
На данный момент поддерживаются только запросы посредством гема `HTTP`.
|
202
|
+
#### Clockwork модификатор
|
113
203
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
204
|
+
`config.modifiers.clockwork`
|
205
|
+
|
206
|
+
Модифицирует форматирование логгера Clockwork.
|
207
|
+
|
208
|
+
#### Модификатор исходящих HTTP-запросов
|
209
|
+
|
210
|
+
`config.modifiers.outgoing_http`
|
211
|
+
|
212
|
+
Добавляет логирование исходящих HTTP-запросов.
|
213
|
+
На данный момент поддерживаются только запросы, выполненные с помощью гема `HTTP`.
|
214
|
+
|
215
|
+
#### Модификатор входящих запросов в Rails
|
216
|
+
|
217
|
+
`config.modifiers.incoming_http`
|
218
|
+
|
219
|
+
Добавляет логирование входящих HTTP-запросов для контроллеров Rails.
|
220
|
+
|
221
|
+
Может иметь дополнительные настройки:
|
222
|
+
|
223
|
+
- `controllers` — массив имён базовых контроллеров, для которых необходимо добавить указанное логирование.
|
224
|
+
|
225
|
+
- `success_condition` — лямбда, определяющая, содержит ли успех ответ экшена.
|
226
|
+
|
227
|
+
Например: `-> { JSON.parse(response.body)['result'] == 'ok' }`
|
228
|
+
|
229
|
+
- `error_info` — лямбда, позволяющая добавить в лог информацию об ошибке, содержащейся в неуспешном ответе экшена.
|
230
|
+
|
231
|
+
Например: `-> { JSON.parse(response.body)['error_code'] }`
|
232
|
+
|
233
|
+
|
234
|
+
Пример (приведены значения по умолчанию):
|
118
235
|
|
119
236
|
```ruby
|
120
237
|
Loggun::Config.configure do |config|
|
@@ -126,26 +243,25 @@ Loggun::Config.configure do |config|
|
|
126
243
|
#...
|
127
244
|
end
|
128
245
|
```
|
129
|
-
- `controllers` - массив имён базовых контроллеров, для которых необходимо добавить указанное логирование.
|
130
246
|
|
131
|
-
|
247
|
+
**Для Rails 6 и выше данный модификатор может работать некорректно.**
|
132
248
|
|
133
|
-
|
134
|
-
Например `-> { JSON.parse(response.body)['error_code'] }`
|
249
|
+
В этом случае можно добавить в требуемый базовый контроллер строку:
|
135
250
|
|
136
|
-
**Для Rails 6 и выше данный модификатор может работать некорректно.**
|
137
|
-
В этом случае можно указать в требуемом базовом контроллере строку:
|
138
251
|
```ruby
|
139
252
|
include Loggun::HttpHelpers
|
140
253
|
```
|
254
|
+
|
141
255
|
Это делает настройки `enable` и `controllers` модификатора безсполезными,
|
142
|
-
однако позволяет гарантированно логировать входящие
|
256
|
+
однако позволяет гарантированно логировать входящие HTTP-запросы.
|
143
257
|
|
144
258
|
Настройки `success_condition` и `error_info` продолжают использоваться и могут быть установлены требуемым образом.
|
145
259
|
|
146
|
-
|
260
|
+
#### Пользовательские модификаторы
|
261
|
+
|
147
262
|
Помимо указанных модификаторов существует возможность добавить собственный.
|
148
|
-
Необходимо уснаследовать его от `Loggun::Modifiers::Base` и указать в методе `apply` все необходимые
|
263
|
+
Необходимо уснаследовать его от `Loggun::Modifiers::Base` и указать в методе `apply` все необходимые действия:
|
264
|
+
|
149
265
|
```ruby
|
150
266
|
require 'sinatra/custom_logger'
|
151
267
|
|
@@ -155,7 +271,9 @@ class NewModifier < Loggun::Modifiers::Base
|
|
155
271
|
end
|
156
272
|
end
|
157
273
|
```
|
158
|
-
|
274
|
+
|
275
|
+
Затем необходимо добавить его при конфигурации гема:
|
276
|
+
|
159
277
|
|
160
278
|
```ruby
|
161
279
|
Loggun::Config.configure do |config|
|
@@ -166,10 +284,12 @@ end
|
|
166
284
|
```
|
167
285
|
|
168
286
|
### Хелперы
|
169
|
-
|
287
|
+
|
288
|
+
Подключение хэлперов в класс позволяет использовать методы логирования `log_info` и `log_error`,
|
170
289
|
а также генерировать идентификатор транзации для каждого метода класса.
|
171
290
|
|
172
291
|
Например:
|
292
|
+
|
173
293
|
```ruby
|
174
294
|
class SomeClass
|
175
295
|
include Loggun::Helpers
|
@@ -183,26 +303,26 @@ class SomeClass
|
|
183
303
|
end
|
184
304
|
end
|
185
305
|
```
|
186
|
-
|
306
|
+
|
307
|
+
При вызове `#download_data` будет следующий вывод в лог:
|
308
|
+
|
187
309
|
```
|
188
310
|
2020-03-04T16:58:38.207+05:00 - 28476 INFO http_request.some_class.download_data#ffg5431_1583323118203 - {"message":["Information"]}
|
189
311
|
2020-03-04T16:58:38.208+05:00 - 28476 INFO http_response.some_class.download_data#ffg5431_1583323118203 - {"success": true}
|
190
312
|
```
|
191
313
|
|
192
|
-
**Важно**, что с
|
314
|
+
**Важно**, что с хэлпером `log_options` необходимо использовать только методы вида `log_<severity>`.
|
193
315
|
Методы модуля `Loggun` не будут работать.
|
194
316
|
|
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}
|
317
|
+
Список всех опций хэлпера `log_options`:
|
205
318
|
|
206
|
-
|
319
|
+
- `entity_name` — имя сущности метода, `string`;
|
320
|
+
- `entity_action` — действие сущности метода, `string`;
|
321
|
+
- `as_transaction` — добавлять ли уникальный ID транзакции для метода, `boolean`;
|
322
|
+
- `transaction_generator` — собственный генератор ID транзакции, `lambda`;
|
323
|
+
- `log_all_methods` — применять ли хэлпер ко всем методам, `boolean`;
|
324
|
+
- `only` — список методов, для которых необходимо применить хэлпер (работает только когда `log_all_methods = false`), `Array{Symbol}`;
|
325
|
+
- `except` — список методов, которые надо исключить для хэлпера, `Array{Symbol}`;
|
326
|
+
- `log_transaction_except` — список методов, логирование которых не нужно обогащать ID транзакции, `Array{Symbol}`.
|
207
327
|
|
208
|
-
|
328
|
+
[![Sponsored by FunBox](https://funbox.ru/badges/sponsored_by_funbox_centered.svg)](https://funbox.ru)
|
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],
|
@@ -20,14 +23,21 @@ module Loggun
|
|
20
23
|
}
|
21
24
|
}.freeze
|
22
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,29 +7,22 @@ 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
|
-
data[:pid] = Process.pid
|
10
|
+
time = time.utc if config.force_utc
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
process_message(data, message)
|
13
|
+
|
14
|
+
data[:type] = loggun_type || Loggun.type || DEFAULT_VALUE.dup
|
15
|
+
|
16
|
+
data[:timestamp] = time.iso8601(config.timestamp_precision)
|
17
|
+
data[:time] = data[:timestamp] if config.log_format == :plain
|
19
18
|
|
20
|
-
data[:message] = message.to_s.tr("\r\n", ' ').strip
|
21
19
|
data[:severity] = severity&.to_s || 'INFO'
|
20
|
+
data[:pid] = Process.pid
|
22
21
|
data[:tags_text] = tags_text
|
23
|
-
data[:type] = loggun_type || Loggun.type || DEFAULT_VALUE.dup
|
24
22
|
data[:transaction_id] = Loggun.transaction_id
|
25
23
|
data[:parent_transaction] = parent_transaction if parent_transaction
|
26
24
|
|
27
|
-
|
28
|
-
data[:transaction_id].to_i != Process.pid
|
29
|
-
data[:type] = "#{data[:type]}##{data[:transaction_id]}"
|
30
|
-
end
|
31
|
-
|
32
|
-
format(config.pattern + "\n", data)
|
25
|
+
prepare_to_output(data)
|
33
26
|
end
|
34
27
|
|
35
28
|
def tagged(*tags)
|
@@ -69,6 +62,41 @@ module Loggun
|
|
69
62
|
|
70
63
|
private
|
71
64
|
|
65
|
+
def process_message(data, message)
|
66
|
+
if message.is_a?(Hash)
|
67
|
+
if config.parent_transaction_to_message && parent_transaction
|
68
|
+
message[:parent_transaction] = parent_transaction
|
69
|
+
end
|
70
|
+
|
71
|
+
if config.log_format == :plain
|
72
|
+
message = format_message(message)
|
73
|
+
else
|
74
|
+
simple_message = message.delete(:message)
|
75
|
+
data[:metadata] = message if message != {}
|
76
|
+
message = simple_message
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
message = message.to_s.tr("\r\n", ' ').strip if config.log_format == :plain
|
81
|
+
|
82
|
+
data[:message] = message
|
83
|
+
end
|
84
|
+
|
85
|
+
def prepare_to_output(data)
|
86
|
+
if data[:transaction_id] && data[:type] != DEFAULT_VALUE &&
|
87
|
+
data[:transaction_id].to_i != Process.pid
|
88
|
+
data[:type] = "#{data[:type]}##{data[:transaction_id]}"
|
89
|
+
end
|
90
|
+
|
91
|
+
if config.log_format == :json
|
92
|
+
data.except!(*config.exclude_keys) if config.only_keys.empty?
|
93
|
+
data.slice!(*config.only_keys) if config.only_keys.any?
|
94
|
+
JSON.generate(data) + "\n"
|
95
|
+
else
|
96
|
+
format(config.pattern + "\n", data)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
72
100
|
def parent_transaction
|
73
101
|
return unless Loggun.parent_type && Loggun.parent_transaction_id
|
74
102
|
|
@@ -78,5 +106,16 @@ module Loggun
|
|
78
106
|
def config
|
79
107
|
Loggun::Config.instance
|
80
108
|
end
|
109
|
+
|
110
|
+
def format_message(message)
|
111
|
+
if config.message_format == :json
|
112
|
+
JSON.generate(message)
|
113
|
+
elsif config.message_format == :key_value
|
114
|
+
message.map { |key, value| "#{key}=#{value}" }.join(' ')
|
115
|
+
else
|
116
|
+
warn('Unknown value for message_format')
|
117
|
+
JSON.generate(message)
|
118
|
+
end
|
119
|
+
end
|
81
120
|
end
|
82
121
|
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)
|
@@ -139,7 +142,9 @@ module Loggun
|
|
139
142
|
type_as_arr = type.split('.')
|
140
143
|
|
141
144
|
if type_as_arr.size == 1
|
142
|
-
log_entity_name = klass.
|
145
|
+
log_entity_name = klass.log_entity_name if klass.respond_to?(:log_entity_name)
|
146
|
+
|
147
|
+
log_entity_name ||= underscore(klass.name.dup)
|
143
148
|
type_as_arr << log_entity_name
|
144
149
|
end
|
145
150
|
|
@@ -8,6 +8,10 @@ module Loggun
|
|
8
8
|
def apply
|
9
9
|
return unless defined?(::Sidekiq) && ::Sidekiq::VERSION >= MIN_SIDEKIQ_V
|
10
10
|
|
11
|
+
::Sidekiq.client_middleware do |chain|
|
12
|
+
chain.add ClientMiddleware
|
13
|
+
end
|
14
|
+
|
11
15
|
::Sidekiq.configure_server do |config|
|
12
16
|
Loggun::Config.setup_formatter(config, LoggunFormatter.new)
|
13
17
|
end
|
@@ -20,6 +24,15 @@ module Loggun
|
|
20
24
|
require 'loggun/modifiers/sidekiq/sidekiq4'
|
21
25
|
end
|
22
26
|
end
|
27
|
+
|
28
|
+
class ClientMiddleware
|
29
|
+
def call(worker_class, _msg, queue, _redis_pool)
|
30
|
+
yield.tap do |options|
|
31
|
+
msg = "Job #{worker_class} JID-#{options['jid']} enqueued to `#{queue}`"
|
32
|
+
Loggun.info('app.sidekiq.enqueued', msg, worker_class: worker_class, jid: options['jid'], queue: queue)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
23
36
|
end
|
24
37
|
end
|
25
38
|
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.6.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-
|
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
|
@@ -182,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
182
183
|
- !ruby/object:Gem::Version
|
183
184
|
version: '0'
|
184
185
|
requirements: []
|
185
|
-
rubygems_version: 3.
|
186
|
+
rubygems_version: 3.1.2
|
186
187
|
signing_key:
|
187
188
|
specification_version: 4
|
188
189
|
summary: Loggun
|