timber 2.0.7 → 2.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -22
- data/benchmarks/rails.rb +122 -0
- data/lib/timber/cli/api.rb +7 -0
- data/lib/timber/cli/install.rb +16 -11
- data/lib/timber/cli/io_helper.rb +11 -5
- data/lib/timber/cli/messages.rb +1 -2
- data/lib/timber/contexts/custom.rb +1 -2
- data/lib/timber/contexts/organization.rb +1 -1
- data/lib/timber/events/http_client_request.rb +1 -1
- data/lib/timber/events/http_server_request.rb +1 -1
- data/lib/timber/logger.rb +6 -0
- data/lib/timber/util/http_event.rb +4 -1
- data/lib/timber/util/string.rb +21 -0
- data/lib/timber/util.rb +1 -0
- data/lib/timber/version.rb +1 -1
- data/spec/timber/events/http_server_request_spec.rb +27 -0
- data/spec/timber/log_entry_spec.rb +2 -2
- data/spec/timber/logger_spec.rb +21 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39440c7ae6a4d416b54191200b5a406681750be5
|
4
|
+
data.tar.gz: 04de3467c2bc3bdc363d1816ea892a74b4b237cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2d65105138fa4e900262dc15274c4a4dbc79b1ecb89a91ffedefcdc64371933d12e5157cb16ffe8999e48375255d2186f7e0cd62ab30efafe13ee9074d2d2a8
|
7
|
+
data.tar.gz: 9e1562e6465a72a7e491841617d58ec5dd1dd10d6174a34a92fba8817fcd80e9d8433555c7e1ead74022fd0bb90b314dc3b3ea8cbb78b61c31c92dba8dcda6a7
|
data/README.md
CHANGED
@@ -15,10 +15,10 @@
|
|
15
15
|
|
16
16
|
Timber for Ruby is an optional upgrade you can install for Ruby apps on the
|
17
17
|
[Timber.io logging platform](https://timber.io). Instead of completely replacing your log messages,
|
18
|
-
Timber
|
18
|
+
Timber efficiently augments your logs with critical metadata. Turning them into
|
19
19
|
[rich events with context](https://timber.io/docs/ruby/events-and-context). This preserves the
|
20
|
-
readability of your logs while still
|
21
|
-
|
20
|
+
readability of your logs while still adding the critical context needed to properly analyze your
|
21
|
+
logs.
|
22
22
|
|
23
23
|
|
24
24
|
## How it works
|
@@ -61,21 +61,6 @@ For a complete overview, see the [Timber for Ruby docs](https://timber.io/docs/r
|
|
61
61
|
3. In your `shell`, run `bundle exec timber install`
|
62
62
|
|
63
63
|
|
64
|
-
## Configuration
|
65
|
-
|
66
|
-
All configuration options can be seen in the
|
67
|
-
[`Timber::Config docs`](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Config).
|
68
|
-
Here are a few popular options:
|
69
|
-
|
70
|
-
1. `config.timber.format =`
|
71
|
-
|
72
|
-
* `:default` - This is the default. It's the original, default, unchanged log messages.
|
73
|
-
|
74
|
-
* `:lograge` - Works exactly like [lograge](https://github.com/roidrage/lograge), except Timber's
|
75
|
-
additional context and metadata is also appended. Lograge++.
|
76
|
-
|
77
|
-
|
78
|
-
|
79
64
|
## Usage
|
80
65
|
|
81
66
|
<details><summary><strong>Basic logging</strong></summary><p>
|
@@ -88,8 +73,6 @@ logger.info("My log message")
|
|
88
73
|
# => My log message @metadata {"level": "info", "context": {...}}
|
89
74
|
```
|
90
75
|
|
91
|
-
Timber will *never* deviate from the public `::Logger` interface in *any* way.
|
92
|
-
|
93
76
|
---
|
94
77
|
|
95
78
|
</p></details>
|
@@ -100,7 +83,7 @@ Custom events allow you to extend beyond events already defined in
|
|
100
83
|
the [`Timber::Events`](lib/timber/events) namespace.
|
101
84
|
|
102
85
|
```ruby
|
103
|
-
|
86
|
+
logger.warn "Payment rejected", payment_rejected: {customer_id: "abcd1234", amount: 100, reason: "Card expired"}
|
104
87
|
|
105
88
|
# => Payment rejected @metadata {"level": "warn", "event": {"payment_rejected": {"customer_id": "abcd1234", "amount": 100, "reason": "Card expired"}}, "context": {...}}
|
106
89
|
```
|
@@ -120,7 +103,7 @@ Custom contexts allow you to extend beyond contexts already defined in
|
|
120
103
|
the [`Timber::Contexts`](lib/timber/contexts) namespace.
|
121
104
|
|
122
105
|
```ruby
|
123
|
-
|
106
|
+
logger.with_context(build: {version: "1.0.0"}) do
|
124
107
|
logger.info("My log message")
|
125
108
|
end
|
126
109
|
|
data/benchmarks/rails.rb
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
require 'benchmark-memory'
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'rails'
|
5
|
+
require 'action_controller'
|
6
|
+
|
7
|
+
io = StringIO.new # ensure we are logging to something
|
8
|
+
logger = Logger.new(io)
|
9
|
+
logger.level = Logger::DEBUG
|
10
|
+
Rails.logger = logger
|
11
|
+
|
12
|
+
#
|
13
|
+
# Setup
|
14
|
+
#
|
15
|
+
|
16
|
+
# Setup the rails app to test
|
17
|
+
class RailsApp < Rails::Application
|
18
|
+
if ::Rails.version =~ /^3\./
|
19
|
+
config.secret_token = '1e05af2b349457936a41427e63450937'
|
20
|
+
else
|
21
|
+
config.secret_key_base = '1e05af2b349457936a41427e63450937'
|
22
|
+
end
|
23
|
+
|
24
|
+
# This ensures our tests fail, otherwise exceptions get swallowed by ActionDispatch::DebugExceptions
|
25
|
+
config.action_dispatch.show_exceptions = false
|
26
|
+
config.active_support.deprecation = :stderr
|
27
|
+
config.eager_load = false
|
28
|
+
end
|
29
|
+
|
30
|
+
# Create a controller to test against
|
31
|
+
class HomeController < ActionController::Base
|
32
|
+
layout nil
|
33
|
+
|
34
|
+
def index
|
35
|
+
render json: {}
|
36
|
+
end
|
37
|
+
|
38
|
+
def method_for_action(action_name)
|
39
|
+
action_name
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Define the routes
|
44
|
+
::RailsApp.routes.draw do
|
45
|
+
get '/' => 'home#index'
|
46
|
+
end
|
47
|
+
|
48
|
+
# Initialize the app
|
49
|
+
RailsApp.initialize!
|
50
|
+
|
51
|
+
# Helper function to issue requests.
|
52
|
+
def dispatch_rails_request(path, additional_env_options = {})
|
53
|
+
application = ::Rails.application
|
54
|
+
env = application.respond_to?(:env_config) ? application.env_config.clone : application.env_defaults.clone
|
55
|
+
env["rack.request.cookie_hash"] = {}.with_indifferent_access
|
56
|
+
env["REMOTE_ADDR"] = "123.456.789.10"
|
57
|
+
env["HTTP_X_REQUEST_ID"] = "unique-request-id-1234"
|
58
|
+
env["action_dispatch.request_id"] = env["HTTP_X_REQUEST_ID"]
|
59
|
+
env = env.merge(additional_env_options)
|
60
|
+
::Rack::MockRequest.new(application).get(path, env)
|
61
|
+
end
|
62
|
+
|
63
|
+
# How many iterations to perform
|
64
|
+
iterations = 1_000
|
65
|
+
|
66
|
+
puts "############################################################"
|
67
|
+
puts ""
|
68
|
+
puts "Testing Without Timber (#{iterations} iterations)"
|
69
|
+
puts ""
|
70
|
+
puts "############################################################"
|
71
|
+
puts
|
72
|
+
|
73
|
+
# Use bmbm to mimimize initial GC differences.
|
74
|
+
puts "Timing via benchmark:"
|
75
|
+
puts ""
|
76
|
+
|
77
|
+
Benchmark.bmbm do |x|
|
78
|
+
x.report("Without Timber") { iterations.times { dispatch_rails_request("/") } }
|
79
|
+
end
|
80
|
+
|
81
|
+
puts "\n"
|
82
|
+
puts "Memory profiling via benchmark-memory:"
|
83
|
+
puts
|
84
|
+
|
85
|
+
Benchmark.memory do |x|
|
86
|
+
x.report("Without Timber") { iterations.times { dispatch_rails_request("/") } }
|
87
|
+
end
|
88
|
+
|
89
|
+
puts "\n\n\n\n"
|
90
|
+
puts "############################################################"
|
91
|
+
puts ""
|
92
|
+
puts "Testing With Timber (#{iterations} iterations)"
|
93
|
+
puts ""
|
94
|
+
puts "############################################################"
|
95
|
+
puts ""
|
96
|
+
|
97
|
+
# Integrate Timber (this is handled in our Railtie, but we cna't use that here since we already
|
98
|
+
# initialized the app.)
|
99
|
+
require 'timber'
|
100
|
+
io = StringIO.new # ensure we are logging to something
|
101
|
+
logger = Timber::Logger.new(io)
|
102
|
+
logger.level = Logger::DEBUG
|
103
|
+
Timber::Frameworks::Rails.set_logger(logger)
|
104
|
+
Timber::Frameworks::Rails.configure_middlewares(Rails.application.config.app_middleware)
|
105
|
+
Timber::Integrations.integrate!
|
106
|
+
Timber::Config.instance.append_metadata = false
|
107
|
+
|
108
|
+
|
109
|
+
puts "Timing via benchmark:"
|
110
|
+
puts ""
|
111
|
+
|
112
|
+
Benchmark.bmbm do |x|
|
113
|
+
x.report("With Timber") { iterations.times { dispatch_rails_request("/") } }
|
114
|
+
end
|
115
|
+
|
116
|
+
puts "\n"
|
117
|
+
puts "Memory profiling via benchmark-memory:"
|
118
|
+
puts ""
|
119
|
+
|
120
|
+
Benchmark.memory do |x|
|
121
|
+
x.report("With Timber") { iterations.times { dispatch_rails_request("/") } }
|
122
|
+
end
|
data/lib/timber/cli/api.rb
CHANGED
data/lib/timber/cli/install.rb
CHANGED
@@ -29,10 +29,10 @@ module Timber
|
|
29
29
|
puts Messages.application_details(app)
|
30
30
|
puts ""
|
31
31
|
|
32
|
-
case ask_yes_no("Are the above details correct?")
|
32
|
+
case ask_yes_no("Are the above details correct?", api)
|
33
33
|
when :yes
|
34
34
|
if app.heroku?
|
35
|
-
update_environment_config("production", :stdout)
|
35
|
+
update_environment_config("production", :stdout, api)
|
36
36
|
|
37
37
|
puts ""
|
38
38
|
puts Messages.separator
|
@@ -40,7 +40,7 @@ module Timber
|
|
40
40
|
puts Messages.heroku_install(app)
|
41
41
|
puts ""
|
42
42
|
|
43
|
-
ask_yes_no("Ready to proceed?")
|
43
|
+
ask_yes_no("Ready to proceed?", api)
|
44
44
|
puts ""
|
45
45
|
|
46
46
|
else
|
@@ -53,19 +53,19 @@ module Timber
|
|
53
53
|
puts "2) Configuring in my app"
|
54
54
|
puts ""
|
55
55
|
|
56
|
-
case ask("Enter your choice: (1/2) ")
|
56
|
+
case ask("Enter your choice: (1/2) ", api)
|
57
57
|
when "1"
|
58
|
-
update_environment_config("production", :http, :api_key_code => "ENV['TIMBER_API_KEY']")
|
58
|
+
update_environment_config("production", :http, api, :api_key_code => "ENV['TIMBER_API_KEY']")
|
59
59
|
|
60
60
|
puts ""
|
61
61
|
puts Messages.http_environment_variables(app.api_key)
|
62
62
|
puts ""
|
63
63
|
|
64
|
-
ask_yes_no("Ready to proceed?")
|
64
|
+
ask_yes_no("Ready to proceed?", api)
|
65
65
|
puts ""
|
66
66
|
|
67
67
|
when "2"
|
68
|
-
update_environment_config("production", :http, :api_key_code => "'#{app.api_key}'")
|
68
|
+
update_environment_config("production", :http, api, :api_key_code => "'#{app.api_key}'")
|
69
69
|
|
70
70
|
end
|
71
71
|
|
@@ -107,7 +107,7 @@ module Timber
|
|
107
107
|
end
|
108
108
|
|
109
109
|
private
|
110
|
-
def update_environment_config(name, log_device_type, options = {})
|
110
|
+
def update_environment_config(name, log_device_type, api, options = {})
|
111
111
|
path = File.join("config", "environments", "#{name}.rb")
|
112
112
|
|
113
113
|
puts ""
|
@@ -146,6 +146,7 @@ CODE
|
|
146
146
|
if !current_contents.include?("Timber::Logger.new")
|
147
147
|
new_contents = current_contents.sub(/\nend/, "\n\n#{logger_code}\nend")
|
148
148
|
File.write(path, new_contents)
|
149
|
+
api.event!(:file_written, path: path)
|
149
150
|
end
|
150
151
|
|
151
152
|
puts colorize(Messages.task_complete(task_message), :green)
|
@@ -156,7 +157,9 @@ CODE
|
|
156
157
|
|
157
158
|
http_device = LogDevices::HTTP.new(api_key)
|
158
159
|
logger = Logger.new(http_device)
|
159
|
-
logger.info("
|
160
|
+
logger.info("Welcome to Timber!")
|
161
|
+
logger.info("This is a test log to ensure the pipes are working")
|
162
|
+
logger.info("Be sure to commit and deploy your app to start seeing real logs")
|
160
163
|
|
161
164
|
puts colorize(Messages.task_complete("Sending test logs"), :green)
|
162
165
|
end
|
@@ -165,7 +168,9 @@ CODE
|
|
165
168
|
puts ""
|
166
169
|
puts Messages.separator
|
167
170
|
puts ""
|
168
|
-
|
171
|
+
|
172
|
+
rating = ask("How would rate this install experience? 1 (bad) - 5 (perfect)", api)
|
173
|
+
|
169
174
|
case rating
|
170
175
|
when "4", "5"
|
171
176
|
api.event!(:feedback, rating: rating.to_i)
|
@@ -177,7 +182,7 @@ CODE
|
|
177
182
|
puts Messages.bad_experience_message
|
178
183
|
puts ""
|
179
184
|
|
180
|
-
comments = ask("Type your comments (enter sends)")
|
185
|
+
comments = ask("Type your comments (enter sends)", api)
|
181
186
|
|
182
187
|
api.event!(:feedback, rating: rating.to_i, comments: comments)
|
183
188
|
|
data/lib/timber/cli/io_helper.rb
CHANGED
@@ -1,20 +1,26 @@
|
|
1
1
|
module Timber
|
2
2
|
class CLI
|
3
3
|
module IOHelper
|
4
|
-
def ask(message)
|
4
|
+
def ask(message, api)
|
5
|
+
api.event!(:waiting_for_input, prompt: message)
|
6
|
+
|
5
7
|
write message + " "
|
6
|
-
gets
|
8
|
+
input = gets
|
9
|
+
|
10
|
+
api.event!(:received_input, prompt: message, value: input)
|
11
|
+
|
12
|
+
input
|
7
13
|
end
|
8
14
|
|
9
|
-
def ask_yes_no(message)
|
10
|
-
case ask(message + " (y/n)")
|
15
|
+
def ask_yes_no(message, api)
|
16
|
+
case ask(message + " (y/n)", api)
|
11
17
|
when "y", "Y"
|
12
18
|
:yes
|
13
19
|
when "n", "N"
|
14
20
|
:no
|
15
21
|
else
|
16
22
|
puts "Woops! That's not a valid input. Please try again."
|
17
|
-
ask_yes_no(message)
|
23
|
+
ask_yes_no(message, api)
|
18
24
|
end
|
19
25
|
end
|
20
26
|
|
data/lib/timber/cli/messages.rb
CHANGED
@@ -45,8 +45,7 @@ message.rstrip
|
|
45
45
|
message = <<-MESSAGE
|
46
46
|
Last step! Commit and deploy:
|
47
47
|
|
48
|
-
#{colorize("git
|
49
|
-
#{colorize("git commit -am 'Install Timber'", :blue)}
|
48
|
+
#{colorize("git commit -m 'Install Timber' config/environments/production.rb", :blue)}
|
50
49
|
|
51
50
|
#{colorize("push and deploy", :blue)} 🚀
|
52
51
|
MESSAGE
|
@@ -3,8 +3,7 @@ module Timber
|
|
3
3
|
# Custom contexts allow you to add application specific context not covered elsewhere.
|
4
4
|
#
|
5
5
|
# @example Adding a context
|
6
|
-
#
|
7
|
-
# Timber::CurrentContext.with(custom_context) do
|
6
|
+
# logger.with_context(build: {version: "1.0.0"}) do
|
8
7
|
# # ... anything logged here will have the context ...
|
9
8
|
# end
|
10
9
|
class Custom < Context
|
@@ -10,7 +10,7 @@ module Timber
|
|
10
10
|
# Example:
|
11
11
|
#
|
12
12
|
# organization_context = Timber::Contexts::Organization.new(id: "abc1234", name: "Timber Inc")
|
13
|
-
#
|
13
|
+
# logger.with_context(organization_context) do
|
14
14
|
# # Logging will automatically include this context
|
15
15
|
# logger.info("This is a log message")
|
16
16
|
# end
|
@@ -13,7 +13,7 @@ module Timber
|
|
13
13
|
@headers = Util::HTTPEvent.normalize_headers(attributes[:headers])
|
14
14
|
@host = attributes[:host] || raise(ArgumentError.new(":host is required"))
|
15
15
|
@method = Util::HTTPEvent.normalize_method(attributes[:method]) || raise(ArgumentError.new(":method is required"))
|
16
|
-
@path = attributes[:path]
|
16
|
+
@path = attributes[:path]
|
17
17
|
@port = attributes[:port]
|
18
18
|
@query_string = Util::HTTPEvent.normalize_query_string(attributes[:query_string])
|
19
19
|
@request_id = attributes[:request_id]
|
@@ -13,7 +13,7 @@ module Timber
|
|
13
13
|
@headers = Util::HTTPEvent.normalize_headers(attributes[:headers])
|
14
14
|
@host = attributes[:host] || raise(ArgumentError.new(":host is required"))
|
15
15
|
@method = Util::HTTPEvent.normalize_method(attributes[:method]) || raise(ArgumentError.new(":method is required"))
|
16
|
-
@path = attributes[:path]
|
16
|
+
@path = attributes[:path]
|
17
17
|
@port = attributes[:port]
|
18
18
|
@query_string = Util::HTTPEvent.normalize_query_string(attributes[:query_string])
|
19
19
|
@scheme = attributes[:scheme] || raise(ArgumentError.new(":scheme is required"))
|
data/lib/timber/logger.rb
CHANGED
@@ -212,6 +212,12 @@ module Timber
|
|
212
212
|
super
|
213
213
|
end
|
214
214
|
|
215
|
+
# Convenience method for adding context. Please see {{Timber::CurrentContext.with}} for
|
216
|
+
# a more detailed description and examples.
|
217
|
+
def with_context(context, &block)
|
218
|
+
Timber::CurrentContext.with(context, &block)
|
219
|
+
end
|
220
|
+
|
215
221
|
# Backwards compatibility with older ActiveSupport::Logger versions
|
216
222
|
Logger::Severity.constants.each do |severity|
|
217
223
|
class_eval(<<-EOT, __FILE__, __LINE__ + 1)
|
@@ -34,7 +34,10 @@ module Timber
|
|
34
34
|
if Config.instance.header_filters && Config.instance.header_filters.include?(k)
|
35
35
|
h[k] = SANITIZED_VALUE
|
36
36
|
else
|
37
|
-
|
37
|
+
# Force the header into a valid UTF-8 string, otherwise we will encounter
|
38
|
+
# encoding issues when we convert this data to json. Moreoever, if the
|
39
|
+
# data is already valid UTF-8 we don't pay a penalty.
|
40
|
+
h[k] = Timber::Util::String.normalize_to_utf8(v)
|
38
41
|
end
|
39
42
|
end
|
40
43
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Timber
|
2
|
+
module Util
|
3
|
+
# @private
|
4
|
+
module String
|
5
|
+
UTF8 = "UTF-8".freeze
|
6
|
+
|
7
|
+
# @private
|
8
|
+
def self.normalize_to_utf8(string)
|
9
|
+
if string.encoding.to_s == UTF8
|
10
|
+
string
|
11
|
+
else
|
12
|
+
string.encode('UTF-8', {
|
13
|
+
:invalid => :replace,
|
14
|
+
:undef => :replace,
|
15
|
+
:replace => '?'
|
16
|
+
})
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/timber/util.rb
CHANGED
data/lib/timber/version.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe Timber::Events::HTTPServerRequest, :rails_23 => true do
|
6
|
+
describe ".initialize" do
|
7
|
+
context "with a header filters" do
|
8
|
+
around(:each) do |example|
|
9
|
+
old_header_filters = Timber::Config.instance.header_filters
|
10
|
+
Timber::Config.instance.header_filters += ['api-key']
|
11
|
+
example.run
|
12
|
+
Timber::Config.instance.header_filters = old_header_filters
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should sanitize headers when a config option is set" do
|
16
|
+
event = described_class.new(:headers => {'Api-Key' => 'abcde'}, :host => 'my.host.com', :method => 'GET', :path => '/path', :scheme => 'https')
|
17
|
+
expect(event.headers).to eq({'api-key' => '[sanitized]'})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should handle header encoding" do
|
22
|
+
referer = 'http://www.metrojobb.se/jobb/1013893-skadeadministratör'.force_encoding('ASCII-8BIT')
|
23
|
+
event = described_class.new(:headers => {'Referer' => referer}, :host => 'my.host.com', :method => 'GET', :path => '/path', :scheme => 'https')
|
24
|
+
expect(event.headers["referer"].encoding.to_s).to eq("UTF-8")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Timber::LogEntry, :rails_23 => true do
|
4
|
-
|
5
|
-
let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
|
4
|
+
let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
|
6
5
|
|
6
|
+
describe "#to_msgpack" do
|
7
7
|
it "should encode properly with an event and context" do
|
8
8
|
event = Timber::Events::Custom.new(type: :event_type, message: "event_message", data: {a: 1})
|
9
9
|
context = {custom: Timber::Contexts::Custom.new(type: :context_type, data: {b: 1})}
|
data/spec/timber/logger_spec.rb
CHANGED
@@ -133,6 +133,27 @@ describe Timber::Logger, :rails_23 => true do
|
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
|
+
describe "#with_context" do
|
137
|
+
let(:io) { StringIO.new }
|
138
|
+
let(:logger) { Timber::Logger.new(io) }
|
139
|
+
|
140
|
+
it "should add context" do
|
141
|
+
expect(Timber::CurrentContext.hash).to eq({})
|
142
|
+
|
143
|
+
logger.with_context(build: {version: "1.0.0"}) do
|
144
|
+
expect(Timber::CurrentContext.hash).to eq({:custom=>{:build=>{:version=>"1.0.0"}}})
|
145
|
+
|
146
|
+
logger.with_context({testing: {key: "value"}}) do
|
147
|
+
expect(Timber::CurrentContext.hash).to eq({:custom=>{:build=>{:version=>"1.0.0"}, :testing=>{:key=>"value"}}})
|
148
|
+
end
|
149
|
+
|
150
|
+
expect(Timber::CurrentContext.hash).to eq({:custom=>{:build=>{:version=>"1.0.0"}}})
|
151
|
+
end
|
152
|
+
|
153
|
+
expect(Timber::CurrentContext.hash).to eq({})
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
136
157
|
describe "#info" do
|
137
158
|
let(:io) { StringIO.new }
|
138
159
|
let(:logger) { Timber::Logger.new(io) }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Timber Technologies, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03
|
11
|
+
date: 2017-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -137,6 +137,7 @@ files:
|
|
137
137
|
- Gemfile
|
138
138
|
- LICENSE.md
|
139
139
|
- README.md
|
140
|
+
- benchmarks/rails.rb
|
140
141
|
- bin/timber
|
141
142
|
- gemfiles/rails-3.0.gemfile
|
142
143
|
- gemfiles/rails-3.1.gemfile
|
@@ -208,6 +209,7 @@ files:
|
|
208
209
|
- lib/timber/util/http_event.rb
|
209
210
|
- lib/timber/util/object.rb
|
210
211
|
- lib/timber/util/request.rb
|
212
|
+
- lib/timber/util/string.rb
|
211
213
|
- lib/timber/util/struct.rb
|
212
214
|
- lib/timber/version.rb
|
213
215
|
- spec/README.md
|
@@ -229,6 +231,7 @@ files:
|
|
229
231
|
- spec/timber/current_context_spec.rb
|
230
232
|
- spec/timber/event_spec.rb
|
231
233
|
- spec/timber/events/custom_spec.rb
|
234
|
+
- spec/timber/events/http_server_request_spec.rb
|
232
235
|
- spec/timber/events_spec.rb
|
233
236
|
- spec/timber/integrations/action_controller/log_subscriber_spec.rb
|
234
237
|
- spec/timber/integrations/action_dispatch/debug_exceptions_spec.rb
|
@@ -283,6 +286,7 @@ test_files:
|
|
283
286
|
- spec/timber/current_context_spec.rb
|
284
287
|
- spec/timber/event_spec.rb
|
285
288
|
- spec/timber/events/custom_spec.rb
|
289
|
+
- spec/timber/events/http_server_request_spec.rb
|
286
290
|
- spec/timber/events_spec.rb
|
287
291
|
- spec/timber/integrations/action_controller/log_subscriber_spec.rb
|
288
292
|
- spec/timber/integrations/action_dispatch/debug_exceptions_spec.rb
|