loggun 0.3.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 64690d6ecfdadf2c32a49d2a688de83dfd2ea90a22e8c87e24544fd6c025100a
4
- data.tar.gz: 428175cd75ee0bef72c3c74450df4c69069a37997794a253a86147883e7d14db
3
+ metadata.gz: 8bdbf0283432b32fe9fe682ca29e432480e1bae6cc4ff31879b50a26120b10c9
4
+ data.tar.gz: bce5fe0878cba0d1e758289baa9b2227bfc81a1946443c2b7bfc8ee4580a3267
5
5
  SHA512:
6
- metadata.gz: e680f49877dcb8418b3653c38ec42187ba17050ba58ac061d383ca9e3cf836d6739f7ae111ec9a7352b8d9ea721a1b4e09ad4d91bb022c6d61b2ff6bacdd4d5f
7
- data.tar.gz: 0e5e5cedcdd59e80c71979a4ae90f87a59b76565b4e02754a2b3c35d1bd264ce8e619330b4944e6035e524ff26e56ba65be0c30b3f71114b7f29d2f84be629cb
6
+ metadata.gz: e8f76f5a5d5244f20d6b3cf5ed1f2c41ef87f93f50ac107626bc6f45cc2a3b44629d6b3d45af61bbd79e424f99ce99f1070937bb97c6e35906c8ea6d2609efd8
7
+ data.tar.gz: 923f02afe9583bbb919671fbeb6fb54e8553efd1a01a6102d2eed865158a21c30c1effdd9e46f836488541b622ac8ae7e5c6ca9bfaa89e43752de40f0827aef3
@@ -3,8 +3,6 @@ sudo: false
3
3
  language: ruby
4
4
  cache: bundler
5
5
  rvm:
6
- - 2.3.8
7
- - 2.4.6
8
6
  - 2.5.5
9
7
  - 2.6.5
10
8
  before_install: gem install bundler
@@ -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
- Loggun - это гем, позволяющий привести все логи приложения к единому формату
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
- Чтобы установить гем, добавьте в ваш Gemfile:
26
+ Чтобы установить гем, добавьте его в Gemfile:
14
27
 
15
28
  ```ruby
16
29
  gem 'loggun'
17
30
  ```
18
31
 
19
- И выполните команду :
32
+ И выполните команду:
20
33
 
21
- $ bundle
34
+ ```bash
35
+ $ bundle
36
+ ```
22
37
 
23
38
  ## Использование
24
- Вы можете использовать Loggun как обертку для вашего Logger. Для этого необходимо передать
25
- ему инстанс вашего логгера и настроить его formatter:
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
- Теперь вы можете использовать Loggun для логгирования в стандартизированном формате:
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
- Подробнее об конфигурации и использовании Loggun ниже.
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
- - `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` - модификаторы для переопределения формата логирования указанного компонента. См. далее.
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
- ##### Rails модификатор
80
- `config.modifier.rails` - модифицирует форматирование логгера Rails.
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
- - `payload_keys` - необходимые ключи в полезной нарзуке. Используется в дефолтном классе. Доступные
102
- ключи: ```%i[sql name duration source]```.
196
+ #### Sidekiq модификатор
103
197
 
104
- ##### Sidekiq модификатор
105
- `config.modifiers.sidekiq` - модифицирует форматирование логгера Sidekiq.
198
+ `config.modifiers.sidekiq`
106
199
 
107
- ##### Clockwork модификатор
108
- `config.modifiers.clockwork` - модифицирует форматирование логгера Clockwork.
200
+ Модифицирует форматирование логгера Sidekiq.
109
201
 
110
- ##### Модификатор исходящих HTTP запросово
111
- `config.modifiers.outgoing_http` - добавляет логирование исходящих http запросов.
112
- На данный момент поддерживаются только запросы посредством гема `HTTP`.
202
+ #### Clockwork модификатор
113
203
 
114
- ##### Модификатор входящих запросов в Rails
115
- `config.modifiers.incoming_http` - добавляет логирование входящих http запросов для контроллеров Rails.
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
- - `success_condition` - лямбда, определяющая, содержит ли успех ответ экшена. Например `-> { JSON.parse(response.body)['result'] == 'ok' }`
247
+ **Для Rails 6 и выше данный модификатор может работать некорректно.**
132
248
 
133
- - `error_info` - лямбда, позволяющая добавить в лог информацию об ошибке, содержащейся в неуспешном ответе экшена.
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
- однако позволяет гарантированно логировать входящие http запросы.
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
- Подключение хелперов в класс позволяет использовать методы логирования `log_info` и `log_error`,
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
- При вызове `#download_data` мы получим следующий вывод в лог:
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
- **Важно**, что с хелпером log_options необходимо использовать только методы вида `log_<severity>`.
314
+ **Важно**, что с хэлпером `log_options` необходимо использовать только методы вида `log_<severity>`.
193
315
  Методы модуля `Loggun` не будут работать.
194
316
 
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}
317
+ Список всех опций хэлпера `log_options`:
205
318
 
206
- ## License
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
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
328
+ [![Sponsored by FunBox](https://funbox.ru/badges/sponsored_by_funbox_centered.svg)](https://funbox.ru)
@@ -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
@@ -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
- data[:time] = time.iso8601(config.timestamp_precision)
11
- data[:pid] = Process.pid
10
+ time = time.utc if config.force_utc
12
11
 
13
- if message.is_a?(Hash)
14
- if config.parent_transaction_to_message && parent_transaction
15
- message[:parent_transaction] = parent_transaction
16
- end
17
- message = JSON.generate(message)
18
- end
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
- if data[:transaction_id] && data[:type] != DEFAULT_VALUE &&
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
@@ -86,7 +86,10 @@ module Loggun
86
86
  attrs[:hidden] = { error: { backtrace: error.backtrace } }
87
87
  end
88
88
  end
89
- attrs[:message] = args unless args.empty?
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.respond_to?(:log_entity_name) ? klass.log_entity_name : underscore(klass.name.dup)
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
@@ -1,3 +1,3 @@
1
1
  module Loggun
2
- VERSION = '0.3.1'.freeze
2
+ VERSION = '0.6.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loggun
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
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-04-21 00:00:00.000000000 Z
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.0.6
186
+ rubygems_version: 3.1.2
186
187
  signing_key:
187
188
  specification_version: 4
188
189
  summary: Loggun