timber 2.0.2 → 2.0.3
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/lib/timber/cli/install.rb +24 -14
- data/lib/timber/cli/messages.rb +13 -14
- data/lib/timber/config.rb +1 -16
- data/lib/timber/events/http_server_request.rb +0 -5
- data/lib/timber/frameworks/rails.rb +27 -10
- data/lib/timber/integrations/rack/http_events.rb +0 -2
- data/lib/timber/logger.rb +7 -4
- data/lib/timber/util/http_event.rb +5 -11
- data/lib/timber/version.rb +1 -1
- data/timber.gemspec +6 -6
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5285d17535de9890e141603c444772904265630
|
4
|
+
data.tar.gz: 5ccb28e7a21bdcaa1d5d71822160114e422e5f7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef8847f90d849dabed1702427574a3864095cf6098801cad33cc45302203bdfdd4ccc11fd0c37c9724342ff29bf2f40c3ae9b98bf8da71d07f1b022f71f4b970
|
7
|
+
data.tar.gz: 8a200733730ff167b57ecbf844bd2aa1ab057bbab66dc3f6d407eec4830877c0b68e9437a1464123fd85bd1f150fdea044d3537cdf679d7414974e45f8d35210
|
data/lib/timber/cli/install.rb
CHANGED
@@ -40,6 +40,9 @@ module Timber
|
|
40
40
|
puts Messages.heroku_install(app)
|
41
41
|
puts ""
|
42
42
|
|
43
|
+
ask_yes_no("Ready to proceed?")
|
44
|
+
puts ""
|
45
|
+
|
43
46
|
else
|
44
47
|
puts ""
|
45
48
|
puts Messages.separator
|
@@ -58,15 +61,18 @@ module Timber
|
|
58
61
|
puts Messages.http_environment_variables(app.api_key)
|
59
62
|
puts ""
|
60
63
|
|
64
|
+
ask_yes_no("Ready to proceed?")
|
65
|
+
puts ""
|
66
|
+
|
61
67
|
when "2"
|
62
68
|
create_initializer(:http, :api_key_code => "'#{app.api_key}'")
|
63
69
|
|
64
|
-
puts ""
|
65
70
|
end
|
66
71
|
|
67
72
|
send_test_messages(api_key)
|
68
73
|
end
|
69
74
|
|
75
|
+
|
70
76
|
api.wait_for_logs do |iteration|
|
71
77
|
write Messages.task_start("Waiting for logs")
|
72
78
|
write Messages.spinner(iteration)
|
@@ -74,10 +80,6 @@ module Timber
|
|
74
80
|
|
75
81
|
puts colorize(Messages.task_complete("Waiting for logs"), :green)
|
76
82
|
|
77
|
-
puts ""
|
78
|
-
puts Messages.separator
|
79
|
-
puts ""
|
80
|
-
puts Messages.free_data
|
81
83
|
puts ""
|
82
84
|
puts Messages.separator
|
83
85
|
puts ""
|
@@ -87,6 +89,12 @@ module Timber
|
|
87
89
|
|
88
90
|
collect_feedback(api)
|
89
91
|
|
92
|
+
puts ""
|
93
|
+
puts Messages.separator
|
94
|
+
puts ""
|
95
|
+
puts Messages.free_data
|
96
|
+
puts ""
|
97
|
+
|
90
98
|
when :no
|
91
99
|
puts ""
|
92
100
|
puts "Bummer. Head to this URL to update the details:"
|
@@ -108,7 +116,7 @@ module Timber
|
|
108
116
|
when :http
|
109
117
|
api_key_code = options[:api_key_code] || raise(ArgumentError.new("the :api_key_code option is required"))
|
110
118
|
"log_device = Timber::LogDevices::HTTP.new(#{api_key_code})\n" +
|
111
|
-
"Timber::Logger.new(log_device)"
|
119
|
+
" Timber::Logger.new(log_device)"
|
112
120
|
|
113
121
|
when :stdout
|
114
122
|
"Timber::Logger.new(STDOUT)"
|
@@ -127,15 +135,19 @@ module Timber
|
|
127
135
|
# Support: support@timber.io
|
128
136
|
|
129
137
|
logger = case Rails.env
|
130
|
-
when "development"
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
138
|
+
when "development"
|
139
|
+
# Write logs to STDOUT in a simple message only format
|
140
|
+
Timber::Logger.new(STDOUT).tap do |logger|
|
141
|
+
logger.formatter = Timber::Logger::SimpleFormatter.new
|
142
|
+
end
|
143
|
+
when "production", "staging"
|
135
144
|
#{logger_code}
|
136
145
|
end
|
137
146
|
|
138
|
-
|
147
|
+
if logger
|
148
|
+
logger.level = Rails.application.config.log_level
|
149
|
+
Timber::Frameworks::Rails.set_logger(logger)
|
150
|
+
end
|
139
151
|
BODY
|
140
152
|
|
141
153
|
FileUtils.mkdir_p(File.join(Dir.pwd, "config", "initializers"))
|
@@ -177,8 +189,6 @@ BODY
|
|
177
189
|
puts ""
|
178
190
|
puts "Thank you! We take feedback seriously and will work to improve this."
|
179
191
|
end
|
180
|
-
|
181
|
-
puts ""
|
182
192
|
end
|
183
193
|
end
|
184
194
|
end
|
data/lib/timber/cli/messages.rb
CHANGED
@@ -17,7 +17,7 @@ module Timber
|
|
17
17
|
|
18
18
|
def application_details(app)
|
19
19
|
message = <<-MESSAGE
|
20
|
-
Woot! Your API 🔑 is valid
|
20
|
+
Woot! Your API 🔑 is valid:
|
21
21
|
|
22
22
|
Name: #{app.name} (#{app.environment})
|
23
23
|
Framework: #{app.framework_type}
|
@@ -43,7 +43,7 @@ message.rstrip
|
|
43
43
|
|
44
44
|
def commit_and_deploy_reminder
|
45
45
|
message = <<-MESSAGE
|
46
|
-
Last step!
|
46
|
+
Last step! Commit and deploy:
|
47
47
|
|
48
48
|
#{colorize("git add config/initializers/timber.rb", :blue)}
|
49
49
|
#{colorize("git commit -am 'Install Timber'", :blue)}
|
@@ -53,6 +53,12 @@ MESSAGE
|
|
53
53
|
message.rstrip
|
54
54
|
end
|
55
55
|
|
56
|
+
def console_url(app)
|
57
|
+
message = <<-MESSAGE
|
58
|
+
Your console URL: https://app.timber.io/organizations/timber/apps/#{app.slug}/console
|
59
|
+
MESSAGE
|
60
|
+
end
|
61
|
+
|
56
62
|
def contact
|
57
63
|
message = <<-MESSAGE
|
58
64
|
Website: #{WEBSITE_URL}
|
@@ -66,7 +72,7 @@ message.rstrip
|
|
66
72
|
message = <<-MESSAGE
|
67
73
|
Great! Add this variable to your environment:
|
68
74
|
|
69
|
-
export TIMBER_API_KEY
|
75
|
+
#{colorize("export TIMBER_API_KEY=\"#{api_key}\"", :blue)}
|
70
76
|
|
71
77
|
MESSAGE
|
72
78
|
message.rstrip
|
@@ -74,15 +80,11 @@ message.rstrip
|
|
74
80
|
|
75
81
|
def free_data
|
76
82
|
message = <<-MESSAGE
|
77
|
-
|
83
|
+
As a welcome gift, we've credited your account with ✨ 50mb✨. Get more:
|
78
84
|
|
79
|
-
* Timber URL: https://app.timber.io
|
80
85
|
* Get ✨ 250mb✨ for tweeting your experience to #{TWITTER_HANDLE}
|
81
86
|
* Get ✨ 100mb✨ for starring our repo: #{REPO_URL}
|
82
|
-
* Get ✨
|
83
|
-
|
84
|
-
(Your account will be credited within 2-3 business days.
|
85
|
-
If you do not notice a credit please contact us: #{SUPPORT_EMAIL})
|
87
|
+
* Get ✨ 100mb✨ for following #{TWITTER_HANDLE} on twitter
|
86
88
|
MESSAGE
|
87
89
|
message.rstrip
|
88
90
|
end
|
@@ -101,13 +103,10 @@ message.rstrip
|
|
101
103
|
|
102
104
|
def heroku_install(app)
|
103
105
|
message = <<-MESSAGE
|
104
|
-
|
105
|
-
|
106
|
-
Please run this command in a separate terminal, return back when complete:
|
106
|
+
To send logs from Heroku please run this command in a separate window:
|
107
107
|
|
108
108
|
#{colorize("heroku drains:add #{app.heroku_drain_url}", :blue)}
|
109
109
|
|
110
|
-
Note: Your Heroku app must be generating logs for this to work.
|
111
110
|
MESSAGE
|
112
111
|
message.rstrip
|
113
112
|
end
|
@@ -175,7 +174,7 @@ message.rstrip
|
|
175
174
|
end
|
176
175
|
|
177
176
|
def we_love_you_too
|
178
|
-
"
|
177
|
+
"Thanks! We 💖 you too!"
|
179
178
|
end
|
180
179
|
end
|
181
180
|
end
|
data/lib/timber/config.rb
CHANGED
@@ -17,29 +17,14 @@ module Timber
|
|
17
17
|
class Config
|
18
18
|
class NoLoggerError < StandardError; end
|
19
19
|
|
20
|
-
FORM_URL_ENCODED_CONTENT_TYPE = "application/x-www-form-urlencoded".freeze
|
21
|
-
JSON_CONTENT_TYPE = "application/json".freeze
|
22
|
-
|
23
20
|
include Singleton
|
24
21
|
|
25
|
-
attr_writer :
|
22
|
+
attr_writer :debug_logger, :http_body_limit, :logger
|
26
23
|
|
27
24
|
def initialize
|
28
|
-
@capture_http_bodies = true
|
29
|
-
@capture_http_body_content_types = [FORM_URL_ENCODED_CONTENT_TYPE, JSON_CONTENT_TYPE]
|
30
25
|
@http_body_limit = 2000
|
31
26
|
end
|
32
27
|
|
33
|
-
# Enables and disables the capturing of HTTP bodies in `Events::HTTPServerRequest`,
|
34
|
-
# `HTTPClientRequest`, and `HTTPClientRespone`.
|
35
|
-
def capture_http_bodies?
|
36
|
-
@capture_http_bodies == true
|
37
|
-
end
|
38
|
-
|
39
|
-
# Limits HTTP body capturing to the listed content types. This must be an array.
|
40
|
-
def capture_http_body_content_types
|
41
|
-
@capture_http_body_content_types ||= []
|
42
|
-
end
|
43
28
|
|
44
29
|
# Set a debug_logger to view internal Timber library log message.
|
45
30
|
# Useful for debugging. Defaults to `nil`. If set, debug messages will be
|
@@ -18,11 +18,6 @@ module Timber
|
|
18
18
|
@query_string = Util::HTTPEvent.normalize_query_string(attributes[:query_string])
|
19
19
|
@scheme = attributes[:scheme] || raise(ArgumentError.new(":scheme is required"))
|
20
20
|
@request_id = attributes[:request_id]
|
21
|
-
|
22
|
-
# This is disabled for now. The ControllerCall event records the parsed params.
|
23
|
-
# This should be sufficient for body inspection. If we come across a case where
|
24
|
-
# it is not we can consider re-enabling this.
|
25
|
-
# @body = Util::HTTPEvent.normalize_body(attributes[:body])
|
26
21
|
end
|
27
22
|
|
28
23
|
def to_hash
|
@@ -5,20 +5,37 @@ module Timber
|
|
5
5
|
class Railtie < ::Rails::Railtie
|
6
6
|
config.timber = Config.instance
|
7
7
|
|
8
|
-
initializer(:
|
9
|
-
Rails.configure_middlewares(config.app_middleware)
|
10
|
-
Integrations.integrate!
|
11
|
-
|
8
|
+
initializer(:timber_silence_logger_complaints, before: :initialize_logger) do
|
12
9
|
# We set a default logger because Rails tries to write to a file by default.
|
13
|
-
# This causes errors on
|
10
|
+
# This causes errors on platforms with a read only file system (Heroku).
|
11
|
+
# See this commit: https://github.com/heroku/rails_stdout_logging/commit/13d092650118bcfeb30f383d3274cee46cbf7b8f
|
14
12
|
# Moreover, the Timber logger gets configured properly later in an initiailizer.
|
15
13
|
# This is a hold over until we reach that file in the initialization process.
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
is_heroku = !ENV['DYNO'].nil?
|
15
|
+
if is_heroku
|
16
|
+
logger = defined?(::ActiveSupport::Logger) ?
|
17
|
+
::ActiveSupport::Logger.new(STDOUT) : ::Logger.new(STDOUT)
|
18
|
+
::Rails.logger = config.logger = logger
|
20
19
|
end
|
21
|
-
|
20
|
+
end
|
21
|
+
|
22
|
+
# Initialize Timber immediately after the logger in case anything uses the logger
|
23
|
+
# during the initialization process.
|
24
|
+
initializer(:timber, after: :initialize_logger) do
|
25
|
+
# The goals here:
|
26
|
+
# 1. Respect the default log device that rails sets in :initialize_logger
|
27
|
+
# 2. Replace the logger with Timber::Logger so that users get our logger API
|
28
|
+
# 3. Disable metadata so that the logger is essentially transparent until further
|
29
|
+
# configuration in initializers/timber.rb. This allows them to essentially "turn on"
|
30
|
+
# timber for production, staging, etc.
|
31
|
+
log_device = ::Rails.logger.instance_variable_get(:@logdev).try(:dev)
|
32
|
+
logger = Logger.new(log_device)
|
33
|
+
logger.formatter = Logger::SimpleFormatter.new
|
34
|
+
logger.level = ::Rails.logger.level
|
35
|
+
::Rails.logger = config.logger = logger
|
36
|
+
|
37
|
+
Rails.configure_middlewares(config.app_middleware)
|
38
|
+
Integrations.integrate!
|
22
39
|
end
|
23
40
|
end
|
24
41
|
|
@@ -10,11 +10,9 @@ module Timber
|
|
10
10
|
def call(env)
|
11
11
|
start = Time.now
|
12
12
|
request = Util::Request.new(env)
|
13
|
-
body = Config.instance.capture_http_bodies? ? request.body_content : nil
|
14
13
|
|
15
14
|
Config.instance.logger.info do
|
16
15
|
Events::HTTPServerRequest.new(
|
17
|
-
body: body,
|
18
16
|
headers: request.headers,
|
19
17
|
host: request.host,
|
20
18
|
method: request.request_method,
|
data/lib/timber/logger.rb
CHANGED
@@ -166,10 +166,11 @@ module Timber
|
|
166
166
|
end
|
167
167
|
end
|
168
168
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
169
|
+
# These are rails modules that change the logger behavior. We have to
|
170
|
+
# include these if they are present or the logger will not function properly
|
171
|
+
# in a rails environment.
|
172
|
+
include ::ActiveSupport::LoggerThreadSafeLevel if defined?(::ActiveSupport::LoggerThreadSafeLevel)
|
173
|
+
include ::LoggerSilence if defined?(::LoggerSilence)
|
173
174
|
|
174
175
|
# Creates a new Timber::Logger instances. Accepts the same arguments as `::Logger.new`.
|
175
176
|
# The only difference is that it default the formatter to {HybridFormatter}. Using
|
@@ -194,6 +195,8 @@ module Timber
|
|
194
195
|
|
195
196
|
self.level = environment_level
|
196
197
|
|
198
|
+
after_initialize if respond_to? :after_initialize
|
199
|
+
|
197
200
|
@initialized = true
|
198
201
|
end
|
199
202
|
|
@@ -15,18 +15,12 @@ module Timber
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
def normalize_body(
|
19
|
-
if
|
20
|
-
|
21
|
-
body = body.body.to_s
|
22
|
-
end
|
23
|
-
|
24
|
-
body[0..(Config.instance.http_body_limit - 1)]
|
25
|
-
else
|
26
|
-
# Drop the body if it is not a format we want to capture.
|
27
|
-
# This gives users more control to avoid loggin files, etc.
|
28
|
-
nil
|
18
|
+
def normalize_body(body)
|
19
|
+
if body.respond_to?(:body)
|
20
|
+
body = body.body.to_s
|
29
21
|
end
|
22
|
+
|
23
|
+
body[0..(Config.instance.http_body_limit - 1)]
|
30
24
|
end
|
31
25
|
|
32
26
|
def normalize_headers(headers)
|
data/lib/timber/version.rb
CHANGED
data/timber.gemspec
CHANGED
@@ -20,16 +20,16 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
s.add_dependency('msgpack', '~> 1.0')
|
22
22
|
|
23
|
-
s.add_development_dependency('rails_stdout_logging', '
|
24
|
-
s.add_development_dependency('rake', '
|
23
|
+
s.add_development_dependency('rails_stdout_logging', '>= 0')
|
24
|
+
s.add_development_dependency('rake', '>= 0')
|
25
25
|
s.add_development_dependency('rspec', '~> 3.4')
|
26
|
-
s.add_development_dependency('rspec-its', '
|
27
|
-
s.add_development_dependency('timecop', '
|
26
|
+
s.add_development_dependency('rspec-its', '>= 0')
|
27
|
+
s.add_development_dependency('timecop', '>= 0')
|
28
28
|
|
29
29
|
if RUBY_PLATFORM == "java"
|
30
|
-
s.add_development_dependency('activerecord-jdbcsqlite3-adapter', '
|
30
|
+
s.add_development_dependency('activerecord-jdbcsqlite3-adapter', '>= 0')
|
31
31
|
else
|
32
|
-
s.add_development_dependency('sqlite3', '
|
32
|
+
s.add_development_dependency('sqlite3', '>= 0')
|
33
33
|
end
|
34
34
|
|
35
35
|
if RUBY_VERSION
|
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.3
|
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-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -28,28 +28,28 @@ dependencies:
|
|
28
28
|
name: rails_stdout_logging
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
@@ -70,42 +70,42 @@ dependencies:
|
|
70
70
|
name: rspec-its
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: timecop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: sqlite3
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|