sapience 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|