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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 756771ea707f7cbaafd88da80dc72afd4311702718de31a087711b258f68d47a
4
- data.tar.gz: b2a00e34692488e289888c9f3d7aa433fc30f66828a160762cf2fe80aa5ea46b
3
+ metadata.gz: 2596dacc5a1bea907afccdabec538190ba574a623c19221189798a1a9f320c74
4
+ data.tar.gz: 2ac4b17d0113f10c3742bf929165c5a6bf95c7273a9e8a2027fe48c170dfef3c
5
5
  SHA512:
6
- metadata.gz: c797ff8ce8de7a5e2da28b95c9e498c1f78b827e5596f0bf1923fe87a3c5376fa5eef46c9169208225c262dc58bc846f05f4d5eefaa11ef8bd75c7e76f7ea2ee
7
- data.tar.gz: 94d4d7bc950a938e82ab17b76fd4e387a169b90f16adeae8199958876847905d28ce698ee47ef4fc17d34102c3e619796cc9e8e03b27dc67b55f36ec34af5f6b
6
+ metadata.gz: a279ad6a07b077bf7af95aaeba39cae3085808e3e9ab77798a950d192d8e8c9f406b7f49c97f46d80bd7b8b12c5fe77bc38c0fff47c2ee0b055363862d8a45eb
7
+ data.tar.gz: 410fc2d3b572a729f5e7c0ecde19426384b401dd8f2d87b89b20731c4dbcba20b89231b463e3e49c76220bdfafd7d058e75dfa3af88faec1b6645001485bb330
@@ -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,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
- 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 ниже.
41
-
42
- ### Конфигурация
43
- Для успешной конфигурации гема необходимо подгружать файл при инициализации вашего приложения.
58
+ ## Конфигурация
44
59
 
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,102 @@ 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`;
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
- ##### Rails модификатор
80
- `config.modifier.rails` - модифицирует форматирование логгера Rails.
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
- - `payload_keys` - необходимые ключи в полезной нарзуке. Используется в дефолтном классе. Доступные
102
- ключи: ```%i[sql name duration source]```.
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
- ##### Sidekiq модификатор
105
- `config.modifiers.sidekiq` - модифицирует форматирование логгера Sidekiq.
207
+ Может иметь дополнительные настройки:
106
208
 
107
- ##### Clockwork модификатор
108
- `config.modifiers.clockwork` - модифицирует форматирование логгера Clockwork.
209
+ - `controllers` — массив имён базовых контроллеров, для которых необходимо добавить указанное логирование.
109
210
 
110
- ##### Модификатор исходящих HTTP запросово
111
- `config.modifiers.outgoing_http` - добавляет логирование исходящих http запросов.
112
- На данный момент поддерживаются только запросы посредством гема `HTTP`.
211
+ - `success_condition` лямбда, определяющая, содержит ли успех ответ экшена.
113
212
 
114
- ##### Модификатор входящих запросов в Rails
115
- `config.modifiers.incoming_http` - добавляет логирование входящих http запросов для контроллеров Rails.
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
- - `success_condition` - лямбда, определяющая, содержит ли успех ответ экшена. Например `-> { JSON.parse(response.body)['result'] == 'ok' }`
233
+ **Для Rails 6 и выше данный модификатор может работать некорректно.**
132
234
 
133
- - `error_info` - лямбда, позволяющая добавить в лог информацию об ошибке, содержащейся в неуспешном ответе экшена.
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
- однако позволяет гарантированно логировать входящие http запросы.
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
- Подключение хелперов в класс позволяет использовать методы логирования `log_info` и `log_error`,
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
- При вызове `#download_data` мы получим следующий вывод в лог:
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
- **Важно**, что с хелпером log_options необходимо использовать только методы вида `log_<severity>`.
300
+ **Важно**, что с хэлпером `log_options` необходимо использовать только методы вида `log_<severity>`.
193
301
  Методы модуля `Loggun` не будут работать.
194
302
 
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}
303
+ Список всех опций хэлпера `log_options`:
205
304
 
206
- ## License
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
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
314
+ [![Sponsored by FunBox](https://funbox.ru/badges/sponsored_by_funbox_centered.svg)](https://funbox.ru)
@@ -5,7 +5,6 @@ require 'loggun/config'
5
5
  require 'loggun/modifiers'
6
6
  require 'loggun/modifiers/base'
7
7
  require 'loggun/helpers'
8
- require 'loggun/http_helpers'
9
8
  require 'logger'
10
9
 
11
10
  module Loggun
@@ -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 incoming_http outgoing_http].freeze
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,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
- data[:time] = time.iso8601(config.timestamp_precision)
11
- data[:pid] = Process.pid
10
+ time = time.utc if config.force_utc
11
+ message = prepare_message(message)
12
12
 
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
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
- format(config.pattern + "\n", data)
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
@@ -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)
@@ -138,8 +141,12 @@ module Loggun
138
141
  type ||= DEFAULT_TYPE.dup
139
142
  type_as_arr = type.split('.')
140
143
 
141
- log_entity_name = klass.respond_to?(:log_entity_name) ? klass.log_entity_name : underscore(klass.name)
142
- type_as_arr << log_entity_name if type_as_arr.size == 1
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
@@ -1,3 +1,3 @@
1
1
  module Loggun
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.5.0'.freeze
3
3
  end
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.2.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-04-13 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
@@ -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: []
@@ -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