sapience 0.2.4 → 0.2.5
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 +4 -4
- data/.codeclimate.yml +21 -0
- data/.simplecov +19 -16
- data/.travis.yml +3 -3
- data/CHANGELOG.md +4 -0
- data/Gemfile +0 -8
- data/README.md +5 -0
- data/config/default.yml +4 -0
- data/docker-compose.yml +14 -0
- data/lib/sapience/appender/stream.rb +0 -1
- data/lib/sapience/base.rb +34 -4
- data/lib/sapience/configuration.rb +41 -20
- data/lib/sapience/core_ext/hash.rb +10 -7
- data/lib/sapience/core_ext/symbol.rb +15 -0
- data/lib/sapience/core_ext/thread.rb +1 -0
- data/lib/sapience/extensions/action_cable/tagged_logger_proxy.rb +2 -0
- data/lib/sapience/extensions/action_controller/live.rb +2 -0
- data/lib/sapience/extensions/action_controller/log_subscriber.rb +76 -121
- data/lib/sapience/extensions/action_dispatch/debug_exceptions.rb +2 -0
- data/lib/sapience/extensions/action_view/log_subscriber.rb +16 -6
- data/lib/sapience/extensions/action_view/streaming_template_renderer.rb +2 -0
- data/lib/sapience/extensions/active_job/logging.rb +1 -1
- data/lib/sapience/extensions/active_model_serializers/logging.rb +7 -2
- data/lib/sapience/extensions/active_record/log_subscriber.rb +45 -29
- data/lib/sapience/extensions/rails/rack/logger.rb +1 -0
- data/lib/sapience/extensions/rails/rack/logger_info_as_debug.rb +2 -0
- data/lib/sapience/formatters/color.rb +0 -1
- data/lib/sapience/formatters/default.rb +0 -1
- data/lib/sapience/formatters/json.rb +0 -1
- data/lib/sapience/formatters/raw.rb +0 -1
- data/lib/sapience/log.rb +54 -35
- data/lib/sapience/logger.rb +50 -71
- data/lib/sapience/rails.rb +17 -20
- data/lib/sapience/sapience.rb +23 -27
- data/lib/sapience/subscriber.rb +1 -13
- data/lib/sapience/version.rb +1 -1
- data/lib/sapience.rb +4 -3
- data/sapience.gemspec +6 -1
- data/test_app/Gemfile +7 -0
- data/test_app/Rakefile +2 -0
- data/test_app/app/models/post.rb +1 -1
- data/test_app/app/views/posts/_form.html.slim +18 -0
- data/test_app/app/views/posts/edit.html.slim +8 -0
- data/test_app/app/views/posts/index.html.slim +25 -0
- data/test_app/app/views/posts/new.html.slim +5 -0
- data/test_app/app/views/posts/show.html.slim +15 -0
- data/test_app/app/workers/test_worker.rb +17 -0
- data/test_app/bin/sneakers +10 -0
- data/test_app/config/initializers/sneakers.rb +15 -0
- data/test_app/config/sapience_example.yml +24 -0
- data/test_app/db/migrate/{20160812093621_create_posts.rb → 20160902141445_create_posts.rb} +1 -1
- data/test_app/db/schema.rb +1 -1
- data/test_app/lib/external_sneaker.rb +46 -0
- data/test_app/spec/factories/posts.rb +7 -0
- data/test_app/spec/factories/users.rb +8 -0
- data/test_app/spec/rails_helper.rb +8 -3
- data/test_app/spec/requests/posts_spec.rb +2 -1
- data/test_app/spec/views/posts/edit.html.slim_spec.rb +17 -0
- data/test_app/spec/views/posts/index.html.slim_spec.rb +17 -0
- data/test_app/spec/views/posts/new.html.slim_spec.rb +17 -0
- data/test_app/spec/views/posts/show.html.slim_spec.rb +14 -0
- data/test_app/spec/workers/test_worker_spec.rb +36 -0
- data/test_app.simplecov +19 -0
- metadata +95 -15
- data/.coveralls.yml +0 -1
- data/lib/sapience/extensions/action_controller/log_subscriber_processing.rb +0 -24
- data/test_app/app/views/posts/_form.html.erb +0 -32
- data/test_app/app/views/posts/create.html.erb +0 -2
- data/test_app/app/views/posts/destroy.html.erb +0 -2
- data/test_app/app/views/posts/edit.html.erb +0 -6
- data/test_app/app/views/posts/index.html.erb +0 -31
- data/test_app/app/views/posts/new.html.erb +0 -5
- data/test_app/app/views/posts/show.html.erb +0 -19
- data/test_app/app/views/posts/update.html.erb +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2ab0f8b23cf762ed9d05be6a9c3da70561f0d72
|
4
|
+
data.tar.gz: da71798a51acb98d05f161264663da01de0e29d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b8a2241815ad570724c0be06c4f51964577d3b9c38c20f13e3f9273300858bedf9bf5e9b4ffa627803a027824b7a8b826c41a89fa7af94c0b72eef5873547db
|
7
|
+
data.tar.gz: b460a771ddbaf06da86ba135563903ccac31c5b0b661db44fb005b2040070c52b2bc003346d5286771790d0a848207dc19c21dd65849c8226564aa22bd4e24ae
|
data/.codeclimate.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
engines:
|
3
|
+
csslint:
|
4
|
+
enabled: false
|
5
|
+
duplication:
|
6
|
+
enabled: true
|
7
|
+
config:
|
8
|
+
languages:
|
9
|
+
- ruby
|
10
|
+
eslint:
|
11
|
+
enabled: false
|
12
|
+
fixme:
|
13
|
+
enabled: true
|
14
|
+
rubocop:
|
15
|
+
enabled: true
|
16
|
+
ratings:
|
17
|
+
paths:
|
18
|
+
- "**.rb"
|
19
|
+
exclude_paths:
|
20
|
+
- config/
|
21
|
+
- spec/
|
data/.simplecov
CHANGED
@@ -1,19 +1,22 @@
|
|
1
|
-
|
2
|
-
require "codeclimate-test-reporter"
|
3
|
-
|
1
|
+
if ENV['CODECLIMATE_REPO_TOKEN']
|
2
|
+
require "codeclimate-test-reporter"
|
3
|
+
CodeClimate::TestReporter.start
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
# require "coveralls"
|
6
|
+
# Coveralls.wear!
|
7
|
+
else
|
8
|
+
require "simplecov-json"
|
9
|
+
SimpleCov.maximum_coverage_drop 1
|
7
10
|
|
8
|
-
SimpleCov.formatters = [
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
Coveralls::SimpleCov::Formatter,
|
13
|
-
]
|
11
|
+
SimpleCov.formatters = [
|
12
|
+
SimpleCov::Formatter::HTMLFormatter,
|
13
|
+
SimpleCov::Formatter::JSONFormatter,
|
14
|
+
]
|
14
15
|
|
15
|
-
SimpleCov.start do
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
16
|
+
SimpleCov.start do
|
17
|
+
add_filter "/spec/"
|
18
|
+
add_filter "/bin/"
|
19
|
+
add_filter "/gemfiles/"
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/.travis.yml
CHANGED
@@ -3,8 +3,8 @@ language: ruby
|
|
3
3
|
services:
|
4
4
|
- docker
|
5
5
|
script:
|
6
|
-
- docker-compose run rspec
|
7
|
-
- docker-compose run test_app
|
6
|
+
- docker-compose run -e TRAVIS=$TRAVIS -e TRAVIS_BRANCH=$TRAVIS_BRANCH -e TRAVIS_JOB_ID=$TRAVIS_JOB_ID -e TRAVIS_PULL_REQUEST=$TRAVIS_PULL_REQUEST rspec
|
7
|
+
- docker-compose run -e TRAVIS=$TRAVIS -e TRAVIS_BRANCH=$TRAVIS_BRANCH -e TRAVIS_JOB_ID=$TRAVIS_JOB_ID -e TRAVIS_PULL_REQUEST=$TRAVIS_PULL_REQUEST test_app
|
8
8
|
notifications:
|
9
9
|
slack:
|
10
|
-
secure: apFwkfBQ+3NDJgcLNCHQori9qtr6ePaN3Xx7Sy7NVWwYm9BHNxoX/FN8/hxR63JjXrf1C0hK0FLQ0TiA0BN9PgEEIecg78BvWUwMClDDiwhyYN3H0Bbg35PUFtgDIrOGpu/TYlxNmdHEDYEAxaWsl9wSds8pAJsN6m7VTjGfBwJUDcOiM4L1eRpbp7smPqOjmuQFuOJnO8YkPb+6nUfz53cJrMRUdha89Vgmvnw6cP4/Ms1TsL3vKmMSVbGGh/6WNKPjU6IbuUjwlsh6a9xWxQOk6Wnis/Z+kA+T0XbLMuTLLmzRDuql1tjJeMPi+wukmK1a7GjpPkpkzAgwLQ/CkjTBfIRbMyaBYSuAciuOY8PDtCcT4WLwEvdZbkFmhAdSr1RYxIBpONVfZ/5DT3bpk71+O74OIBqxG6NmkiZ0B6u9/KxbnIINLVAcVaqsN8sdSqWlWKzPm45BfGPXGjmGGgIVFU31rs+W5Zs7IYMNUjZxabYKIv9TsBONbogfbcoGZA+rWWUnQdjypNWJS9wyQDvJ4btxqy8YhDfaV6gF30Un5JcAggMutzKJiYi+qAeh0uN3/9XoXV2N6XBnh58h8ny1NY+0vklWhtFGR1wfFAqkDskvCIZabSeJ5bFM6FtNbNKq9tYciS+eAO1vEYQVDFt9eY2uZF2mFDKRnEegHMU=
|
10
|
+
secure: apFwkfBQ+3NDJgcLNCHQori9qtr6ePaN3Xx7Sy7NVWwYm9BHNxoX/FN8/hxR63JjXrf1C0hK0FLQ0TiA0BN9PgEEIecg78BvWUwMClDDiwhyYN3H0Bbg35PUFtgDIrOGpu/TYlxNmdHEDYEAxaWsl9wSds8pAJsN6m7VTjGfBwJUDcOiM4L1eRpbp7smPqOjmuQFuOJnO8YkPb+6nUfz53cJrMRUdha89Vgmvnw6cP4/Ms1TsL3vKmMSVbGGh/6WNKPjU6IbuUjwlsh6a9xWxQOk6Wnis/Z+kA+T0XbLMuTLLmzRDuql1tjJeMPi+wukmK1a7GjpPkpkzAgwLQ/CkjTBfIRbMyaBYSuAciuOY8PDtCcT4WLwEvdZbkFmhAdSr1RYxIBpONVfZ/5DT3bpk71+O74OIBqxG6NmkiZ0B6u9/KxbnIINLVAcVaqsN8sdSqWlWKzPm45BfGPXGjmGGgIVFU31rs+W5Zs7IYMNUjZxabYKIv9TsBONbogfbcoGZA+rWWUnQdjypNWJS9wyQDvJ4btxqy8YhDfaV6gF30Un5JcAggMutzKJiYi+qAeh0uN3/9XoXV2N6XBnh58h8ny1NY+0vklWhtFGR1wfFAqkDskvCIZabSeJ5bFM6FtNbNKq9tYciS+eAO1vEYQVDFt9eY2uZF2mFDKRnEegHMU=
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
@@ -2,11 +2,3 @@ source "https://rubygems.org"
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in sapience.gemspec
|
4
4
|
gemspec
|
5
|
-
|
6
|
-
gem "pry-nav"
|
7
|
-
gem "sentry-raven"
|
8
|
-
gem "dogstatsd-ruby"
|
9
|
-
gem "rails", "~> 5.0.0.1"
|
10
|
-
gem "grape"
|
11
|
-
gem "active_model_serializers", "~> 0.10.0"
|
12
|
-
gem "rspec-wait"
|
data/README.md
CHANGED
@@ -62,6 +62,7 @@ Sapience.configure do |config|
|
|
62
62
|
{ sentry: { dsn: "https://username:password@app.getsentry.com/00000" } },
|
63
63
|
{ datadog: { url: "udp://localhost:8125" } },
|
64
64
|
]
|
65
|
+
config.log_executor = :single_thread_executor
|
65
66
|
end
|
66
67
|
```
|
67
68
|
|
@@ -70,6 +71,7 @@ Sapience provides a default configuration that will be used unless another file
|
|
70
71
|
```yaml
|
71
72
|
---
|
72
73
|
default:
|
74
|
+
log_executor: single_thread_executor
|
73
75
|
log_level: info
|
74
76
|
appenders:
|
75
77
|
- stream:
|
@@ -77,6 +79,7 @@ default:
|
|
77
79
|
formatter: color
|
78
80
|
|
79
81
|
test:
|
82
|
+
log_executor: immediate_executor
|
80
83
|
log_level: warn
|
81
84
|
appenders:
|
82
85
|
- stream:
|
@@ -84,6 +87,7 @@ test:
|
|
84
87
|
formatter: color
|
85
88
|
|
86
89
|
development:
|
90
|
+
log_executor: single_thread_executor
|
87
91
|
log_level: debug
|
88
92
|
appenders:
|
89
93
|
- stream:
|
@@ -91,6 +95,7 @@ development:
|
|
91
95
|
formatter: color
|
92
96
|
|
93
97
|
production:
|
98
|
+
log_executor: single_thread_executor
|
94
99
|
log_level: warn
|
95
100
|
appenders:
|
96
101
|
- stream:
|
data/config/default.yml
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
---
|
2
2
|
default:
|
3
|
+
log_executor: single_thread_executor
|
3
4
|
log_level: info
|
4
5
|
appenders:
|
5
6
|
- stream:
|
@@ -7,6 +8,7 @@ default:
|
|
7
8
|
formatter: color
|
8
9
|
|
9
10
|
test:
|
11
|
+
log_executor: immediate_executor
|
10
12
|
log_level: warn
|
11
13
|
appenders:
|
12
14
|
- stream:
|
@@ -14,6 +16,7 @@ test:
|
|
14
16
|
formatter: color
|
15
17
|
|
16
18
|
development:
|
19
|
+
log_executor: single_thread_executor
|
17
20
|
log_level: debug
|
18
21
|
appenders:
|
19
22
|
- stream:
|
@@ -21,6 +24,7 @@ development:
|
|
21
24
|
formatter: color
|
22
25
|
|
23
26
|
production:
|
27
|
+
log_executor: single_thread_executor
|
24
28
|
log_level: warn
|
25
29
|
appenders:
|
26
30
|
- stream:
|
data/docker-compose.yml
CHANGED
@@ -4,6 +4,12 @@ volumes:
|
|
4
4
|
driver: local
|
5
5
|
|
6
6
|
services:
|
7
|
+
rabbitmq:
|
8
|
+
image: rabbitmq:latest
|
9
|
+
environment:
|
10
|
+
RABBITMQ_DEFAULT_USER: sapience
|
11
|
+
RABBITMQ_DEFAULT_PASS: tests
|
12
|
+
|
7
13
|
rails:
|
8
14
|
image: ruby:2.3
|
9
15
|
cpu_shares: 4
|
@@ -24,12 +30,17 @@ services:
|
|
24
30
|
|
25
31
|
# Mount the 'gems' volume on the folder that stores bundled gems:
|
26
32
|
- gems:/usr/local/bundle
|
33
|
+
|
34
|
+
|
27
35
|
rspec:
|
28
36
|
extends:
|
29
37
|
service: rails
|
30
38
|
entrypoint: /usr/src/app/dev-entrypoint.sh
|
31
39
|
command: bundle exec rake
|
40
|
+
depends_on:
|
41
|
+
- rabbitmq
|
32
42
|
environment:
|
43
|
+
CODECLIMATE_REPO_TOKEN: 204dc055302da6aed94379e249aa0645636d1d1794920c62db05c5fa968215de
|
33
44
|
PATH: /usr/src/app/bin:/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
34
45
|
|
35
46
|
test_app:
|
@@ -38,5 +49,8 @@ services:
|
|
38
49
|
working_dir: /usr/src/app/test_app
|
39
50
|
entrypoint: /usr/src/app/dev-entrypoint.sh
|
40
51
|
command: bundle exec rspec
|
52
|
+
depends_on:
|
53
|
+
- rabbitmq
|
41
54
|
environment:
|
55
|
+
AMQP: amqp://sapience:tests@rabbitmq:5672
|
42
56
|
PATH: /usr/src/app/bin:/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
@@ -108,7 +108,6 @@ module Sapience
|
|
108
108
|
# Ruby or Rails Loggers
|
109
109
|
def log(log)
|
110
110
|
return false unless should_log?(log)
|
111
|
-
|
112
111
|
# Since only one appender thread will be writing to the file at a time
|
113
112
|
# it is not necessary to protect access to the file with a semaphore
|
114
113
|
# Allow this logger to filter out log levels lower than it's own
|
data/lib/sapience/base.rb
CHANGED
@@ -128,6 +128,7 @@ module Sapience
|
|
128
128
|
def push_tags(*tags)
|
129
129
|
Sapience.push_tags(*tags)
|
130
130
|
end
|
131
|
+
alias_method :tags=, :push_tags
|
131
132
|
|
132
133
|
# :nodoc:
|
133
134
|
def pop_tags(quantity = 1)
|
@@ -144,6 +145,21 @@ module Sapience
|
|
144
145
|
Sapience.fast_tag(tag, &block)
|
145
146
|
end
|
146
147
|
|
148
|
+
# Returns [Sapience::Formatters::Default] formatter default for this subscriber
|
149
|
+
def default_formatter
|
150
|
+
Sapience::Formatters::Default.new
|
151
|
+
end
|
152
|
+
|
153
|
+
# Allow application name to be set globally or per subscriber
|
154
|
+
def application
|
155
|
+
Sapience.config.application
|
156
|
+
end
|
157
|
+
|
158
|
+
# Allow host name to be set globally or per subscriber
|
159
|
+
def host
|
160
|
+
Sapience.config.host
|
161
|
+
end
|
162
|
+
|
147
163
|
# Thread specific context information to be logged with every log entry
|
148
164
|
#
|
149
165
|
# Add a payload to all log calls on This Thread within the supplied block
|
@@ -271,13 +287,15 @@ module Sapience
|
|
271
287
|
payload = payload.nil? ? self.payload : self.payload.merge(payload)
|
272
288
|
end
|
273
289
|
|
290
|
+
merged_tags = merge_tags_with_payload(payload)
|
274
291
|
# Add caller stack trace
|
275
292
|
backtrace = extract_backtrace if index >= Sapience.config.backtrace_level_index
|
276
293
|
|
277
|
-
log = Log.new(level, Thread.current.name, name, message, payload, Time.now, nil,
|
294
|
+
log = Log.new(level, Thread.current.name, name, message, payload, Time.now, nil, merged_tags, index, exception, nil, backtrace)
|
278
295
|
|
279
296
|
# Logging Hash only?
|
280
297
|
# logger.info(name: 'value')
|
298
|
+
|
281
299
|
if payload.nil? && exception.nil? && message.is_a?(Hash)
|
282
300
|
payload = message.dup
|
283
301
|
min_duration = payload.delete(:min_duration) || 0.0
|
@@ -291,13 +309,21 @@ module Sapience
|
|
291
309
|
end
|
292
310
|
log.payload = payload if payload.size > 0
|
293
311
|
end
|
294
|
-
|
295
312
|
self.log(log) if include_message?(log)
|
296
313
|
end
|
297
314
|
# rubocop:enable AbcSize, PerceivedComplexity, CyclomaticComplexity, LineLength
|
298
315
|
|
299
316
|
SELF_PATTERN = File.join("lib", "sapience")
|
300
317
|
|
318
|
+
def merge_tags_with_payload(payload = {})
|
319
|
+
merged_tags = tags.dup
|
320
|
+
if payload.is_a?(Hash)
|
321
|
+
payload_tags = payload.delete(:tags) || []
|
322
|
+
merged_tags.concat(payload_tags) if payload_tags.size > 0
|
323
|
+
end
|
324
|
+
merged_tags.uniq
|
325
|
+
end
|
326
|
+
|
301
327
|
# Extract the callers backtrace leaving out Sapience
|
302
328
|
def extract_backtrace
|
303
329
|
stack = caller
|
@@ -346,6 +372,9 @@ module Sapience
|
|
346
372
|
if self.payload
|
347
373
|
payload = payload.nil? ? self.payload : self.payload.merge(payload)
|
348
374
|
end
|
375
|
+
|
376
|
+
merged_tags = merge_tags_with_payload(payload)
|
377
|
+
|
349
378
|
if exception
|
350
379
|
logged_exception = exception
|
351
380
|
backtrace = nil
|
@@ -370,7 +399,8 @@ module Sapience
|
|
370
399
|
logged_exception = nil
|
371
400
|
backtrace = exception.backtrace
|
372
401
|
end
|
373
|
-
|
402
|
+
|
403
|
+
log = Log.new(level, Thread.current.name, name, message, payload, end_time, duration, merged_tags, index, logged_exception, metric, backtrace) # rubocop:disable LineLength
|
374
404
|
self.log(log) if include_message?(log)
|
375
405
|
fail exception
|
376
406
|
elsif duration >= min_duration
|
@@ -378,7 +408,7 @@ module Sapience
|
|
378
408
|
# Add caller stack trace
|
379
409
|
backtrace = extract_backtrace if index >= Sapience.config.backtrace_level_index
|
380
410
|
|
381
|
-
log = Log.new(level, Thread.current.name, name, message, payload, end_time, duration,
|
411
|
+
log = Log.new(level, Thread.current.name, name, message, payload, end_time, duration, merged_tags, index, nil, metric, backtrace) # rubocop:disable LineLength
|
382
412
|
self.log(log) if include_message?(log)
|
383
413
|
end
|
384
414
|
end
|
@@ -1,30 +1,38 @@
|
|
1
1
|
require "ostruct"
|
2
2
|
|
3
3
|
module Sapience
|
4
|
+
UnkownLogLevel = Class.new(StandardError)
|
5
|
+
InvalidLogExecutor = Class.new(StandardError)
|
6
|
+
|
4
7
|
# rubocop:disable ClassVars
|
5
8
|
class Configuration
|
6
9
|
attr_reader :default_level, :backtrace_level, :backtrace_level_index
|
7
10
|
attr_writer :host
|
8
|
-
attr_accessor :application, :ap_options, :appenders
|
11
|
+
attr_accessor :application, :ap_options, :appenders, :log_executor
|
9
12
|
|
13
|
+
SUPPORTED_EXECUTORS = %i(single_thread_executor immediate_executor).freeze
|
10
14
|
DEFAULT = {
|
11
15
|
log_level: :info,
|
12
16
|
application: "Sapience",
|
13
17
|
host: nil,
|
14
18
|
ap_options: { multiline: false },
|
15
19
|
appenders: [{ stream: { io: STDOUT, formatter: :color } }],
|
20
|
+
log_executor: :single_thread_executor,
|
16
21
|
}.freeze
|
17
22
|
|
18
23
|
# Initial default Level for all new instances of Sapience::Logger
|
19
24
|
def initialize(options = {}) # rubocop:disable AbcSize
|
20
25
|
fail ArgumentError, "options need to be a hash" unless options.is_a?(Hash)
|
21
|
-
@options = DEFAULT.merge(options.
|
26
|
+
@options = DEFAULT.merge(options.deep_symbolize_keyz!)
|
27
|
+
@options[:log_executor] &&= @options[:log_executor].to_sym
|
28
|
+
validate_log_executor!(@options[:log_executor])
|
22
29
|
self.default_level = @options[:log_level].to_sym
|
23
30
|
self.backtrace_level = @options[:log_level].to_sym
|
24
31
|
self.application = @options[:application]
|
25
32
|
self.host = @options[:host]
|
26
33
|
self.ap_options = @options[:ap_options]
|
27
34
|
self.appenders = @options[:appenders]
|
35
|
+
self.log_executor = @options[:log_executor]
|
28
36
|
end
|
29
37
|
|
30
38
|
# Sets the global default log level
|
@@ -44,25 +52,35 @@ module Sapience
|
|
44
52
|
def level_to_index(level) # rubocop:disable AbcSize, PerceivedComplexity, CyclomaticComplexity
|
45
53
|
return if level.nil?
|
46
54
|
|
47
|
-
|
48
|
-
|
49
|
-
LEVELS.index(level)
|
50
|
-
elsif level.is_a?(String)
|
51
|
-
level = level.downcase.to_sym
|
55
|
+
case level
|
56
|
+
when Symbol
|
52
57
|
LEVELS.index(level)
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
end
|
60
|
-
levels
|
61
|
-
end
|
62
|
-
@@map_levels[level]
|
58
|
+
when String
|
59
|
+
LEVELS.index(level.downcase.to_sym)
|
60
|
+
when Integer
|
61
|
+
map_levels[level] || fail_with_unkown_log_level!(level)
|
62
|
+
else
|
63
|
+
fail_with_unkown_log_level!(level)
|
63
64
|
end
|
64
|
-
|
65
|
-
|
65
|
+
end
|
66
|
+
|
67
|
+
def fail_with_unkown_log_level!(level)
|
68
|
+
fail UnkownLogLevel,
|
69
|
+
"Invalid level:#{level.inspect} being requested." \
|
70
|
+
" Must be one of #{LEVELS.inspect}"
|
71
|
+
end
|
72
|
+
|
73
|
+
# Mapping of Rails and Ruby Logger levels to Sapience levels
|
74
|
+
def map_levels
|
75
|
+
return [] unless defined?(::Logger::Severity)
|
76
|
+
@@map_levels ||=
|
77
|
+
::Logger::Severity.constants.each_with_object([]) do |constant, levels|
|
78
|
+
levels[::Logger::Severity.const_get(constant)] = level_by_index_or_error(constant)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def level_by_index_or_error(constant)
|
83
|
+
LEVELS.find_index(constant.downcase.to_sym) || LEVELS.find_index(:error)
|
66
84
|
end
|
67
85
|
|
68
86
|
def default_level_index
|
@@ -92,6 +110,9 @@ module Sapience
|
|
92
110
|
@host ||= Socket.gethostname
|
93
111
|
end
|
94
112
|
|
95
|
-
|
113
|
+
def validate_log_executor!(log_executor)
|
114
|
+
return true if SUPPORTED_EXECUTORS.include?(log_executor)
|
115
|
+
fail InvalidLogExecutor, "#{log_executor} is unsupported. Use (#{SUPPORTED_EXECUTORS.join(", ")})"
|
116
|
+
end
|
96
117
|
end
|
97
118
|
end
|
@@ -1,25 +1,28 @@
|
|
1
1
|
class Hash
|
2
2
|
# Returns a Hash with all keys symbolized
|
3
|
-
def
|
4
|
-
|
3
|
+
def deep_symbolize_keyz!
|
4
|
+
deep_transform_keyz! { |key| key.to_sym rescue key } # rubocop:disable RescueModifier
|
5
5
|
end
|
6
|
+
alias_method :deep_symbolize_keys!, :deep_symbolize_keyz!
|
6
7
|
|
7
|
-
def
|
8
|
-
|
8
|
+
def deep_transform_keyz!(&block)
|
9
|
+
_deep_transform_keyz_in_object!(self, &block)
|
9
10
|
end
|
11
|
+
alias_method :deep_transform_keys!, :deep_transform_keyz!
|
10
12
|
|
11
|
-
def
|
13
|
+
def _deep_transform_keyz_in_object!(object, &block)
|
12
14
|
case object
|
13
15
|
when Hash
|
14
16
|
object.keys.each do |key|
|
15
17
|
value = object.delete(key)
|
16
|
-
object[yield(key)] =
|
18
|
+
object[yield(key)] = _deep_transform_keyz_in_object!(value, &block)
|
17
19
|
end
|
18
20
|
object
|
19
21
|
when Array
|
20
|
-
object.map! { |e|
|
22
|
+
object.map! { |e| _deep_transform_keyz_in_object!(e, &block) }
|
21
23
|
else
|
22
24
|
object
|
23
25
|
end
|
24
26
|
end
|
27
|
+
alias_method :_deep_transform_keys_in_object!, :_deep_transform_keyz_in_object!
|
25
28
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Symbol
|
2
|
+
def camelize(uppercase_first_letter = true)
|
3
|
+
string = to_s
|
4
|
+
string = if uppercase_first_letter
|
5
|
+
string.sub(/^[a-z\d]*/) { $&.capitalize }
|
6
|
+
else
|
7
|
+
string.sub(/^(?:(?=\b|[A-Z_])|\w)/) { $&.downcase }
|
8
|
+
end
|
9
|
+
string.gsub!(/(?:_|(\/))([a-z\d]*)/i) do
|
10
|
+
"#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}"
|
11
|
+
end
|
12
|
+
string.gsub!(/\//, "::")
|
13
|
+
string
|
14
|
+
end unless :sym.respond_to?(:camelize)
|
15
|
+
end
|