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 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