loggun 0.2.0 → 0.5.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: 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