sapience 1.0.8 → 1.0.9

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
  SHA1:
3
- metadata.gz: 2c3bbc9e597e92775e21ecdab149da717f6f4cac
4
- data.tar.gz: d97388214be0ee09bca68a2d543ceb1e99c4862f
3
+ metadata.gz: 35f1a2a161ecc2efb23decddb30df46b01b372ed
4
+ data.tar.gz: f112df7cbf9149371fed662c5451c553c58ccecc
5
5
  SHA512:
6
- metadata.gz: b8a669055e80b6b23f63936dcb57be52574fe7e8785437faaee36e0172c66765fed710dbe650e6bd7da7f82fda773b4413e049fe8dd2933b0dd28f31908f1a8c
7
- data.tar.gz: 9da937b7b59ff08c3165d5167f72eed549564bb569025f9db1d1532cfb3c8deaa5efb549d24f3fab2b60799ec3e62437393c553f8278a9c7ffb37083dae8a1fa
6
+ metadata.gz: 40fb5ccbf8c3deedb4ab1b51d87ef97138f18511c0df18709341342f4acb30c6b7138d3c334fcba41d92da4e644b029faeee3b2a768697c2bda0b9b232770d47
7
+ data.tar.gz: 745ade15fbe6afbdab30967ecd09f8ce48de280e6c9f69541b7aef93533f9ec7957df6ec6673567fa9042338c4cc03540e7ba8e615aecb05f572b5b104799e58
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ - Added `filter_parameters` configuration to obfuscate sensitive information such as passwords for rack-like applications
2
+
3
+ ## v1.0.8
4
+
5
+ - Delayed configuration of Sentry until the configuration is valid
6
+
1
7
  ## v1.0.3
2
8
 
3
9
  - Rename `SAPIENCE_APP_NAME` to `APP_NAME`
@@ -30,11 +36,11 @@
30
36
 
31
37
  ## v0.2.13
32
38
 
33
- - Set Rails.logger even some gems disables logging on initialisation.
39
+ - Set Rails.logger even some gems disables logging on initialisation.
34
40
 
35
41
  ## v0.2.12
36
42
 
37
- - Adds support for Rails apps with disabled ActiveRecord
43
+ - Adds support for Rails apps with disabled ActiveRecord
38
44
 
39
45
  ## v0.2.11
40
46
 
@@ -73,7 +79,7 @@
73
79
 
74
80
  ## v0.2.0
75
81
 
76
- - Rename Appender::File to Appender::Stream. Accept option stream instead of file in `sapience.yml`
82
+ - Rename Appender::File to Appender::Stream. Accept option stream instead of file in `sapience.yml`
77
83
 
78
84
  ## v0.1.12
79
85
 
data/README.md CHANGED
@@ -16,13 +16,13 @@ We have taken a great deal of inspiration from the amazing [Semantic Logger](htt
16
16
 
17
17
  First of all we need to require the right file for the project. There are currently two frameworks supported (rails and grape).
18
18
 
19
- ### Rails
19
+ ### Rails
20
20
 
21
21
  ```ruby
22
22
  gem "sapience", require: "sapience/rails"
23
23
  ```
24
24
 
25
- ### Grape
25
+ ### Grape
26
26
 
27
27
  ```ruby
28
28
  gem "sapience", require: "sapience/grape"
@@ -37,11 +37,11 @@ module Aslan
37
37
  module API
38
38
  class Base < Grape::API
39
39
  use Sapience::Extensions::Grape::Middleware::Logging, logger: Sapience[self]
40
-
40
+
41
41
  # To log all requests even when no route was found try the following:
42
42
  route :any, "*path" do
43
43
  error!({ error: "No route found" }, 404)
44
- end
44
+ end
45
45
  end
46
46
  end
47
47
  end
@@ -54,7 +54,7 @@ The sapience configuration can be controlled by a `config/sapience.yml` file or
54
54
 
55
55
  The `app_name` is required to be configured. Sapience will fail on startup if app_name isn't configured properly.
56
56
 
57
- ```ruby
57
+ ```ruby
58
58
  Sapience.configure do |config|
59
59
  config.default_level = :info
60
60
  config.backtrace_level = :error
@@ -67,11 +67,14 @@ Sapience.configure do |config|
67
67
  end
68
68
  ```
69
69
 
70
- Sapience provides a default configuration that will be used unless another file or configuration is specified. You can provide a custom
70
+ Sapience provides a default configuration that will be used unless another file or configuration is specified. You can provide a custom
71
71
 
72
72
  ```yaml
73
73
  ---
74
74
  default:
75
+ filter_parameters:
76
+ - password
77
+ - password_confirmation
75
78
  log_executor: single_thread_executor
76
79
  log_level: info
77
80
  appenders:
@@ -145,6 +148,39 @@ Sapience.configure do |config|
145
148
  end
146
149
  ```
147
150
 
151
+ #### Filtering out sensitive data
152
+
153
+ **NOTE: This is intended for (and will currently only work with) Rack-like applications, which include a `params` key in their `payload` hash**
154
+
155
+ You may not want to log certain parameters which have sensitive information to be in the logs, e.g. `password`. This can be set using the `filter_parameters` option when using `configure`:
156
+
157
+ ```ruby
158
+ Sapience.configure do |config|
159
+ # Filter the value of "foo" from rack's parameter hash
160
+ config.filter_parameters << 'foo'
161
+ end
162
+ ```
163
+
164
+ Note that by default this is set to `['password', 'password_confirmation']`, so be careful when explicitly setting, as you may lose this filtering:
165
+
166
+ ```ruby
167
+ Sapience.configure do |config|
168
+ # NOTE: password and password_confirmation will no longer be filtered
169
+ config.filter_parameters = ['foo']
170
+ end
171
+ ```
172
+
173
+ Similarly, *be particularly careful* when setting as `yaml` because this will no longer filter `password` and `password_confirmation`:
174
+
175
+ ```yaml
176
+ some_environment:
177
+ # NOTE: password and password_confirmation will no longer be filtered if they're not included in this list
178
+ filter_parameters:
179
+ - foo
180
+ ```
181
+
182
+ Any filtered parameter will still show in the `params` field, but it's value will be `[FILTERED]`.
183
+
148
184
  ## Appenders
149
185
 
150
186
  One of the things that did not suit us so well with the Semantic Logger approach was that they made a distinction between metrics and appenders. In our view anything that could potentially log something somewhere should be treated as an appender.
@@ -154,7 +190,7 @@ There are a number of appenders that each listen to different events and act on
154
190
 
155
191
  ### Stream
156
192
 
157
- Stream appenders are basically a log stream. You can add as many stream appenders as you like logging to different locations.
193
+ Stream appenders are basically a log stream. You can add as many stream appenders as you like logging to different locations.
158
194
 
159
195
  ```ruby
160
196
  Sapience.add_appender(:stream, file: "log/sapience.log", formatter: :json)
@@ -167,16 +203,16 @@ The sentry appender handles sending errors to [sentry](https://sentry.io). It's
167
203
 
168
204
  ```ruby
169
205
  Sapience.add_appender(
170
- :sentry,
171
- dsn: "https://username:password@app.getsentry.com/00000",
172
- level: :error,
206
+ :sentry,
207
+ dsn: "https://username:password@app.getsentry.com/00000",
208
+ level: :error,
173
209
  backtrace_level: :error
174
210
  )
175
211
  ```
176
212
 
177
213
  #### Test exceptions
178
214
 
179
- If you want to quickly verify that your appenders are handling exceptions properly. You can use the following method to
215
+ If you want to quickly verify that your appenders are handling exceptions properly. You can use the following method to
180
216
  generate and log an exception at any given level.
181
217
 
182
218
  ```ruby
@@ -203,7 +239,7 @@ metrics.decrement("company/project/metric-name", 5)
203
239
  metrics.histogram("company/project/metric-name", 2_500)
204
240
  metrics.gauge("company/project/metric-name", 1_000, {})
205
241
  metrics.event("company/project/metric-name", "description about event", {})
206
- metrics.batch do
242
+ metrics.batch do
207
243
  metrics.event("company/project/metric-name", "description about event", {})
208
244
  metrics.increment("company/project/another-metric-name", 2)
209
245
  end
@@ -226,15 +262,15 @@ Formatters can be specified by using the key `formatter: :camelized_formatter_na
226
262
 
227
263
  `formatter: :color` - gives colorized output. Useful for `test` and `development` environments.
228
264
 
229
- ### Default
265
+ ### Default
230
266
 
231
267
  `formatter: :default` - logs a string. Inspired by how access logs for Nginx are logged.
232
268
 
233
- ### JSON
269
+ ### JSON
234
270
 
235
271
  `formatter: :json` - logs are saved as a single line json. Useful for production like environments.
236
272
 
237
- ### RAW
273
+ ### RAW
238
274
 
239
275
  `formatter: :raw` - logs are saved as a single line ruby hash. Useful for production like environments and is used internally for the Sentry appender.
240
276
 
data/config/default.yml CHANGED
@@ -1,5 +1,8 @@
1
1
  ---
2
2
  default:
3
+ filter_parameters:
4
+ - password
5
+ - password_confirmation
3
6
  log_executor: single_thread_executor
4
7
  log_level: info
5
8
  appenders:
@@ -8,15 +8,16 @@ module Sapience
8
8
  class Configuration
9
9
  attr_reader :default_level, :backtrace_level, :backtrace_level_index
10
10
  attr_writer :host
11
- attr_accessor :app_name, :ap_options, :appenders, :log_executor
11
+ attr_accessor :app_name, :ap_options, :appenders, :log_executor, :filter_parameters
12
12
 
13
13
  SUPPORTED_EXECUTORS = %i(single_thread_executor immediate_executor).freeze
14
14
  DEFAULT = {
15
- log_level: :info,
16
- host: nil,
17
- ap_options: { multiline: false },
18
- appenders: [{ stream: { io: STDOUT, formatter: :color } }],
19
- log_executor: :single_thread_executor,
15
+ log_level: :info,
16
+ host: nil,
17
+ ap_options: { multiline: false },
18
+ appenders: [{ stream: { io: STDOUT, formatter: :color } }],
19
+ log_executor: :single_thread_executor,
20
+ filter_parameters: %w(password password_confirmation),
20
21
  }.freeze
21
22
 
22
23
  # Initial default Level for all new instances of Sapience::Logger
@@ -25,13 +26,14 @@ module Sapience
25
26
  @options = DEFAULT.merge(options.dup.deep_symbolize_keyz!)
26
27
  @options[:log_executor] &&= @options[:log_executor].to_sym
27
28
  validate_log_executor!(@options[:log_executor])
28
- self.default_level = @options[:log_level].to_sym
29
- self.backtrace_level = @options[:log_level].to_sym
30
- self.host = @options[:host]
31
- self.app_name = @options[:app_name]
32
- self.ap_options = @options[:ap_options]
33
- self.appenders = @options[:appenders]
34
- self.log_executor = @options[:log_executor]
29
+ self.default_level = @options[:log_level].to_sym
30
+ self.backtrace_level = @options[:log_level].to_sym
31
+ self.host = @options[:host]
32
+ self.app_name = @options[:app_name]
33
+ self.ap_options = @options[:ap_options]
34
+ self.appenders = @options[:appenders]
35
+ self.log_executor = @options[:log_executor]
36
+ self.filter_parameters = @options[:filter_parameters]
35
37
  end
36
38
 
37
39
  # Sets the global default log level
data/lib/sapience/log.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Sapience
2
2
  # Log Struct
3
3
  #
4
- # Structure for holding all log entries
4
+ # Structure for holding all log entries. We're using a struct because we want it to be fast and lightweight.
5
5
  #
6
6
  # level
7
7
  # Log level of the supplied log call
@@ -140,6 +140,23 @@ module Sapience
140
140
  payload.inspect if payload?
141
141
  end
142
142
 
143
+ # This filtering is specifically designed for Rack-based payloads which may
144
+ # have sensitive information such as "password" or "credit_card" in
145
+ # its hash. We need to obfuscate these fields.
146
+ def payload # rubocop:disable AbcSize
147
+ return self[:payload] unless self[:payload].is_a?(Hash) && self[:payload][:params].is_a?(Hash)
148
+ return @payload unless @payload.nil?
149
+
150
+ # We don't want to mutate the existing object so dup
151
+ @payload = self[:payload].dup
152
+
153
+ Sapience.config.filter_parameters.each do |filter|
154
+ @payload[:params][filter] = "[FILTERED]" if @payload[:params].key?(filter)
155
+ end
156
+
157
+ @payload
158
+ end
159
+
143
160
  # Returns [true|false] whether the log entry has a payload
144
161
  def payload?
145
162
  !(payload.nil? || (payload.respond_to?(:empty?) && payload.empty?))
@@ -6,12 +6,13 @@ require "English"
6
6
  # Example:
7
7
  #
8
8
  # Sapience.configure do |config|
9
- # config.default_level = ENV.fetch('SAPIENCE_DEFAULT_LEVEL') { :info }.to_sym
10
- # config.backtrace_level = ENV.fetch('SAPIENCE_BACKTRACE_LEVEL') { :info }.to_sym
11
- # config.app_name = 'TestApplication'
12
- # config.host = ENV.fetch('SAPIENCE_HOST', nil)
13
- # config.ap_options = { multiline: false }
14
- # config.appenders = [
9
+ # config.default_level = ENV.fetch('SAPIENCE_DEFAULT_LEVEL') { :info }.to_sym
10
+ # config.backtrace_level = ENV.fetch('SAPIENCE_BACKTRACE_LEVEL') { :info }.to_sym
11
+ # config.app_name = 'TestApplication'
12
+ # config.host = ENV.fetch('SAPIENCE_HOST', nil)
13
+ # config.ap_options = { multiline: false }
14
+ # config.filter_parameters << "credit_card"
15
+ # config.appenders = [
15
16
  # { stream: { io: STDOUT, formatter: :color } },
16
17
  # { statsd: { url: 'udp://localhost:2222' } },
17
18
  # { sentry: { dsn: 'https://foobar:443' } },
@@ -1,3 +1,3 @@
1
1
  module Sapience
2
- VERSION = "1.0.8"
2
+ VERSION = "1.0.9"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sapience
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.8
4
+ version: 1.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikael Henriksson
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-10-04 00:00:00.000000000 Z
12
+ date: 2016-10-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: concurrent-ruby